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