Python实现批量处理文件的缩进和转码问题
最近把很久前的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文件处理后输出到新的文件夹,新文件夹与源文件夹所在目录相同,且包结构完全相同。
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') 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)
Python实现批量处理文件的缩进和转码问题的更多相关文章
- 利用 Python 进行批量更改文件后缀
利用 Python 进行批量更改文件后缀 代码 import os files = os.listdir('.') for file_name in files: portion = os.path. ...
- Python之批量读取文件【面试必学】
python的os模块可以实现普遍的操作系统功能,并且和平台无关.以下为实现根目录下文件的批量读取. os.listdir(dirname)可以列出dirname下的目录和文件,依次读取相应的文件即可 ...
- python脚本批量复制文件
1.拷贝一个目录下的所有文件及文件夹到另一个目录下(递归拷贝) # cat /home/test.py #!/usr/bin/python import os import shutil def ...
- python 之 批量替换文件中文本后缀
代码示例如下: #!/usr/local/bin python import os def swapextensions(dir, before, after): if before[:1] != ' ...
- python 多线程批量传文件
#!/usr/bin/env python #_*_ coding:utf-8 -*-#autho:leiyong#time:2017-06-05#version: 1.3 import parami ...
- python实现批量压缩文件夹
前段时间碰到一个需要把目录下文件夹压缩的项目,但是度娘里没找到,只好自己写脚本了. #coding:utf-8 import os filePath = raw_input("请输入路径:& ...
- ubuntu批量更改文件权限
重装系统之后,把文件从windows分区拷到linux分区发现所有文件的权限全是777,在终端下看到所有文件的颜色都很刺眼,文件有很多,一个一个改不现实,所以写了一段python脚本批量更改文件权限. ...
- python批量进行文件修改操作
python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...
- Python 实现批量从不同的Linux服务器下载文件
基于Python实现批量从不同的Linux服务器下载文件 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/file_for_downl ...
随机推荐
- Libra白皮书解读
文章目录 Libra简介 Libra区块链 Libra货币和存储 Libra协会 Libra简介 Libra是facebook发起的一个区块链项目,其使命是建立一套简单的.无国界的货币和为数十亿人服务 ...
- 编写管理IP地址参数脚本(永久性)
1.用各种命令取出/etc/passwd文件前5行的最后一个字母.(2种) 2.编写管理IP地址参数脚本(永久性) a.只能用sed命令完成 b.提示用户变量赋值(IP.子网掩码.网关.DNS等) c ...
- python实现逻辑回归
首先得明确逻辑回归与线性回归不同,它是一种分类模型.而且是一种二分类模型. 首先我们需要知道sigmoid函数,其公式表达如下: 其函数曲线如下: sigmoid函数有什么性质呢? 1.关于(0,0. ...
- vue-cli3.0 gui初体验
为什么80%的码农都做不了架构师?>>> 介绍 新版的vuecli3.0提供了一个vue ui这个命令,这个命令是做什么的呢,这里引用官网的一段介绍 vue ui 你可以通过 v ...
- 自定义View之Canvas使用
自定义View的绘制流程一般都是这样:提前创建好Paint对象,重写onDraw(),把绘制代码卸载ondraw()里面,大致如下: Paint paint = new Paint(); @Overr ...
- 监控之--Nagios如何监控本地主机及本地服务
上一节内容介绍了Nagios监控服务在linux环境下的安装过程,本节内容将详细介绍如何使用已经安装的Nagios服务的一些配置文件的使用以及如何监控本地相关服务,如要完成对一台主机的监控Nagios ...
- 网速慢?不!可能是DNS出了问题! 公共DNS优选之 BAT 百度、腾讯、阿里、谷歌DNS哪个更快?
如果一下还是解决不了你的问题请这边走 首先是Google的DNS: 8.8.8.8 丢包严重 PASS但是扶墙的时候是必备的,如果有扶墙的需求的话可以备用. 二.百度DNS 180.76.76.76 ...
- tomcat8调优
a. tomcat的运行原理: 1. Tomcat是运行在JVM中的一个进程.它定义为[中间件],顾名思义,是一个在Java项目与JVM之间的中间容器. 2. Web项目的本质,是一大堆的资源文件和方 ...
- 学习笔记之MySQL的使用
什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文 ...
- CtsSecurityTestCases#ListeningPortsTest定位tcp端口与pid
CtsSecurityTestCases#ListeningPortsTest定位tcp端口与pid [问题描述] cts失败项 armeabi-v7a CtsSecurityTestCases an ...