最近把很久前的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实现批量处理文件的缩进和转码问题的更多相关文章

  1. 利用 Python 进行批量更改文件后缀

    利用 Python 进行批量更改文件后缀 代码 import os files = os.listdir('.') for file_name in files: portion = os.path. ...

  2. Python之批量读取文件【面试必学】

    python的os模块可以实现普遍的操作系统功能,并且和平台无关.以下为实现根目录下文件的批量读取. os.listdir(dirname)可以列出dirname下的目录和文件,依次读取相应的文件即可 ...

  3. python脚本批量复制文件

    1.拷贝一个目录下的所有文件及文件夹到另一个目录下(递归拷贝) # cat /home/test.py #!/usr/bin/python  import os  import shutil def ...

  4. python 之 批量替换文件中文本后缀

    代码示例如下: #!/usr/local/bin python import os def swapextensions(dir, before, after): if before[:1] != ' ...

  5. python 多线程批量传文件

    #!/usr/bin/env python #_*_ coding:utf-8 -*-#autho:leiyong#time:2017-06-05#version: 1.3 import parami ...

  6. python实现批量压缩文件夹

    前段时间碰到一个需要把目录下文件夹压缩的项目,但是度娘里没找到,只好自己写脚本了. #coding:utf-8 import os filePath = raw_input("请输入路径:& ...

  7. ubuntu批量更改文件权限

    重装系统之后,把文件从windows分区拷到linux分区发现所有文件的权限全是777,在终端下看到所有文件的颜色都很刺眼,文件有很多,一个一个改不现实,所以写了一段python脚本批量更改文件权限. ...

  8. python批量进行文件修改操作

    python批量修改文件扩展名 在网上下载了一些文件,因为某种原因,扩展名多了一个后缀'.xxx',手动修改的话因为文件太多,改起来费时费力,于是决定写个小脚本进行修改. 1.要点: import r ...

  9. Python 实现批量从不同的Linux服务器下载文件

    基于Python实现批量从不同的Linux服务器下载文件   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/file_for_downl ...

随机推荐

  1. 标准库sys

    sys模块的主要函数介绍,结合官方文档说明和实例.This module provides access to some variables used or maintained by the int ...

  2. spring-boot下mybatis的配置

    问题描述:spring boot项目想添加mybatis的配置,在src/main/resources目录下新建了mybatis-config.xml文件,在application.propertie ...

  3. MongoDB学习(四):通过Java使用MongoDB

    环境配置 在Java项目中使用MongoDB,需要在项目中引入mongo.jar这个包.下载地址:下载 请尽量下载较新的版本,本文用的是2.10.1. 连接MongoDB public synchro ...

  4. Vim Configuration

    安装原生态的Vim之后,界面是这样的: 行号,没有:自动缩进,没有:括号匹配,没有~ 为了我们使用的方便,进行一些基本的配置: sudo vim /etc/vim/vimrc 进入配置界面: 如下图进 ...

  5. OSG程序设计之Hello World 3.0

    直接上代码: #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <osgViewer/View ...

  6. G - Pictures with Kittens (easy version) dp

    https://codeforces.com/problemset/problem/1077/F1 这个其实是一个比较简单的dp了 题目大意: 给你n个数,让你从n个数里选出x个数,并且每隔k个至少选 ...

  7. 【Spark】DataFrame关于数据常用操作

    文章目录 DSL语法 概述 实例操作 SQL语法 概述 实例操作 DSL语法 概述 1.查看全表数据 -- DataFrame.show 2.查看部分字段数据(有4种方法)  (1) DataFram ...

  8. HttpClient之Post接口代码范例

    核心包: import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject; 一:接收数据 json数据格式如下 ...

  9. CodeForces-650B Image Preview 二分+模拟

    CodeForces-650B Image Preview 题意 手机里有n张图片,打开相机出现的是第一张,第一张右滑得到第n张,同理第n张左滑得到第1张,翻页耗费a秒,看照片耗费1s,但是照片有横屏 ...

  10. [hdu2112]最短路

    相当于模板题了,用trie来完成字符串到数字的映射比map<string, int>要快不少,令外可以考虑hash. 运行时间对比: (1)(2)600ms左右 (3)3000ms左右(4 ...