四個月沒來部落格園發博,發現多了一個功能:複製代碼。 這本是好事,但很可惜,我複製的 python 代碼,部落格園幫我在每行的首位元組處添加了一個空格,python 這種強縮排風格導致複製的代碼跑不起來,把空格去掉是唯一的方法。而開啟代碼檔案手動刪除每行的第一個空格可行,但不現實。此文便為此而生,二為練手=,=。
先來一個簡單的代碼,主要是由使用者輸入所要刪除空格的代碼檔案,程式在運行目錄下建立了一個 backup.py 檔案,開啟原檔案逐一去掉空格的同時寫進這個新檔案裡。代碼比較簡單:
version_1
1 ori_file = raw_input('Input: ')
2 new_file = open('backup.py', 'w')
3 for line in open(ori_file):
4 if line:
5 line = line[1:]
6 new_file.write(line)
7 new_file.close()
8 raw_input('Done. Press any key to continue...')
目的已達到,但練手為其中一個目的,不妨多設定一些需求。下面是我的想法,包括大致上的設計思路。
1. 列印選擇:輸入目錄,則處理目錄下的所有檔案;輸入數量不定的檔案名稱,若不包含目錄則將其判斷為目前的目錄,處理找到的檔案,將不存在的檔案返回給使用者。
2. 判斷輸入:若為目錄,則將目錄下的所有檔案放置在列表中,遍曆列表的檔案即可;若為檔案,則輸入的多個檔案名稱可這樣處理器 for file in input.split().
另外我還想實現接受目錄和檔案混合輸入的情況,可將輸入全部放到列表中,逐一判斷其元素為目錄或是檔案,再相應處理。 代碼如下:
version_2
1 import os
2 import os.path as op
3
4 __all__ = ['deal_dir', 'deal_file']
5
6 def begin_bak():
7 deal_with = raw_input('Input: ')
8 for each in deal_with.split():
9 if op.isdir(each):
10 deal_dir(each)
11 elif op.isfile(each):
12 deal_file(each)
13 else:
14 print "Cannot find %s ." % each
15
16 def deal_dir(each):
17 dir_file = []
18 for root, dirs, fnames in os.walk(each):
19 if fnames:
20 for fn in fnames:
21 dir_file.append(op.join(root, fn))
22 for each in dir_file:
23 baking(each)
24
25 def deal_file(each):
26 if op.exists(each):
27 each = op.join('.', each)
28 else:
29 print 'Cannot find %s .' % each
30 baking(each)
31
32 def baking(each):
33 new_file = open(op.splitext(each)[0] + '.bak.py', 'w')
34 file_list = list(open(each))
35 for line in file_list:
36 if line == file_list[0]:
37 line = line
38 else:
39 line = line[1:]
40 new_file.write(line)
41 new_file.close()
42
43 if __name__ == '__main__':
44 begin_bak()
45 raw_input('Done. Press any key to continue...')
運行後看到 Input: 時輸入所要處理的目錄和檔案,. 號表示目前的目錄。如果檔案名稱不帶有路徑,則預設為當前路徑。
至此全文完,當然啦,希望部落格園儘快修好這個 bug 啦。抑或是故意的= =?
Done. Press any key to continue...