Python实现批量处理文件的缩进和转码问题
2017-12-06 22:35
561 查看
最近把很久前的C代码传到Github上的时候,发现全部上百个源文件的代码缩进都变成了8格,而且里面的中文都出现了乱码,所以决定写个程序来批量处理所有文件的格式。这段关于转码的代码可以适用于很多场合,比如Window下默认编码是GBK,而Linux下默认编码是UTF-8,如果两者间传输的文件中出现中文,则需要进行转码。
问题分析
缩进问题是因为在之前使用vc时没有将制符表设置为4个空格,而Github上的Tab键默认显示八格。中文乱码问题是由于vc++使用的是GBK编码。
解决思路
1.缩进问题,也就是用空格替换Tab,通过Python程序读取每一行C代码,计算出对应的空格个数,添加到去除首尾空格的源字符串前构成新的一行,然后写入新的文件。
2.乱码问题,根据Python特性,读取一行字符串后,将在内部自动解码(decode)为Unicode形式,只需要在写入时以utf-8进行编码(encode)并输出就可以实现编码的转换。注意Python输入输出的默认编码为cp936(gbk),要在打开文件时指定写入文件的编码格式。
3.程序只需接收原始文件夹的路径,通过递归遍历将目录中所有C文件处理后输出到新的文件夹,新文件夹与源文件夹所在目录相同,且包结构完全相同。
问题分析
缩进问题是因为在之前使用vc时没有将制符表设置为4个空格,而Github上的Tab键默认显示八格。中文乱码问题是由于vc++使用的是GBK编码。
解决思路
1.缩进问题,也就是用空格替换Tab,通过Python程序读取每一行C代码,计算出对应的空格个数,添加到去除首尾空格的源字符串前构成新的一行,然后写入新的文件。
2.乱码问题,根据Python特性,读取一行字符串后,将在内部自动解码(decode)为Unicode形式,只需要在写入时以utf-8进行编码(encode)并输出就可以实现编码的转换。注意Python输入输出的默认编码为cp936(gbk),要在打开文件时指定写入文件的编码格式。
3.程序只需接收原始文件夹的路径,通过递归遍历将目录中所有C文件处理后输出到新的文件夹,新文件夹与源文件夹所在目录相同,且包结构完全相同。
import os, codecs #计算该行应有的缩进空格(考虑Tab和空格混用的情况) def count_space(st): count = 0 if st == '\n': return 0 for ch in st: if ch == '\t': count = count + 4 elif ch == ' ': count = count + 1 else: break return count #处理文件:1.将tab转换成相应个数的空格 2.转化为utf-8编码 def process_file(src_path, dest_path): #设置写入的编码方式为utf-8 #或使用open(dest_path, 'w', encoding = 'utf8') with open(src_path, 'r') as fr, codecs.open(dest_path, 'w', 'utf-8') < a31e span class="hljs-keyword">as fw: for line in fr.readlines(): clean_line = line.strip() n_space = count_space(line) i = 0 sp = '' while i < n_space: sp = sp + ' ' i = i + 1 line = sp + clean_line + '\n' fw.write(line) #递归遍历整个目录 def travel(src_path, dest_path, item): if not os.path.isdir(src_path): if os.path.splitext(src_path)[1] == item: process_file(src_path, dest_path) #直到遇到相应文件,就进行处理 return if not os.path.isdir(dest_path): #创建对应的目标目录 os.mkdir(dest_path) #层层深入 for filename in os.listdir(src_path): travel(os.path.join(src_path, filename), os.path.join(dest_path, filename), item) if __name__ == '__main__': src_root = 'C:\\Users\\Administrator\\Desktop\\C-Primer-Plus' #接收要处理的文件夹(这里直接指定) dest_root = src_root + '-new' item = '.c' travel(src_root, dest_root, item)
相关文章推荐
- java 自己实现项目一键全转码 解决文件乱码问题
- python读写文件时中文的转码问题
- Python实现的json文件读取及中文乱码显示问题解决方法
- Python实现的两个文件操作:当前目录下所有文件和转码
- Python转码问题的解决方法
- JSPSmart实现文件上传时file和text表单同时提交的问题
- 关于python使用pyrex编译成可执行文件的问题
- 研究了三天的文件上传(jspsmart实现)file和text表单同时提交的问题
- 用python实现文件比较
- 研究了三天的文件上传(jspsmart实现)file和text表单同时提交的问题
- JSP实现文件下载应注意的几个问题
- 用UDP实现在网络上传输文件的问题。
- Python open读写文件实现脚本
- jsp实现文件下载与中文文件名乱码问题解决
- Python转码问题的解决方法
- 我遇到的问题JspSmartUpload组件实现表单和文件同时上传
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- jsp实现文件下载与中文文件名乱码问题解决
- Python处理MLDonkey 下载中文文件乱码问题