四个月没来博客园发博,发现多了一个功能:复制代码。 这本是好事,但很可惜,我复制的 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...