以下代码只处理了assic和utf8文件。其它文件编码为保险起见并未加入支持。
参数
exts 需要处理文件的扩展名
folders 需要处理的文件夹及子目录
处理目录为当前目录
运行:
添加bom头
python proc_bom.py
删除bom头
python proc_bom.py -r

运行缺少chardet报错

方法1:在线安装

  pip install chardet

方法2:离线安装

https://github.com/chardet/chardet

https://pypi.python.org/pypi/chardet#downloads

去下载chardet包

进入到chardet 3.0.4 的解压包里,执行:python setup.py install 就可以完成安装了。

 1 #!/usr/bin/python
2 # -*- coding: UTF-8 -*-
3
4 import os;
5 import sys;
6 import codecs;
7 import chardet;
8
9 #获取脚本文件的当前路径
10 def cur_file_dir():
11 #获取脚本路径
12 path = sys.path[0]
13 #判断为脚本文件还是py2exe编译后的文件,如果是脚本文件,则返回的是脚本的目录,如果是py2exe编译后的文件,则返回的是编译后的文件路径
14 if os.path.isdir(path):
15 return path
16 elif os.path.isfile(path):
17 return os.path.dirname(path)
18 #打印结果
19
20
21 #pip install chardet 安装相应插件
22 def procBOM(strPath,curLen, bAdd):
23 newcontent = '';
24 f = open(strPath, "rb");
25 fcontent = f.read();
26 f.close();
27 printBuffer = strPath[curLen:]
28 codeType = chardet.detect(fcontent)["encoding"] #检测编码方式
29 printBuffer = printBuffer + " "+str(codeType)
30
31 if codeType.lower().find('utf-8') == -1 and codeType.lower().find('ascii') == -1 :
32 #非utf8文件保险起见先退出,并输出错误提示,todo后续再添加其它转码到utf8
33 print printBuffer + " error OK"
34 return
35
36 #不需要转换,已经添加bom头
37
38 if bAdd and fcontent[:3] != codecs.BOM_UTF8:
39 print printBuffer+" add bom",
40 newcontent = codecs.BOM_UTF8;
41 newcontent += fcontent;
42 elif not bAdd and fcontent[:3] == codecs.BOM_UTF8:
43 newcontent = fcontent[3:];
44 print printBuffer+" del bom",
45 else:
46 return;
47 fnew = open(strPath, "wb+")
48 fnew.write(newcontent);
49 fnew.close();
50 print "done"
51 return
52
53 if __name__ == "__main__":
54
55 bAdd = True;
56 exts = ['.h', '.c', '.cpp'];
57 folders = ["GNaviInterface/search","src","tester"]
58 bAdd = True;
59 if(len(sys.argv) > 1 and sys.argv[1] == '-r'):
60 bAdd = False;
61 curLen = len(cur_file_dir())
62 for folderName in folders:
63 folderPath = cur_file_dir()+"/"+folderName+"/"
64 #print "procBOM:folder path = "+folderPath+",add = "+str(bAdd)
65 for parent,dirnames,filenames in os.walk(folderPath):
66 for f in filenames:
67 bTargetFile = False;
68 for e in exts:
69 if(f.endswith(e)):
70 bTargetFile = True;
71 if(bTargetFile):
72 procBOM(os.path.join(parent,f),curLen, bAdd);
73 #print 'file:%s add:%s' % (os.path.join(parent, f), bAdd);

p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }
p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }
span.s1 { font-variant-ligatures: no-common-ligatures }

Python处理utf-8 添加和删除BOM头的更多相关文章

  1. 检测文件是否有BOM 头,并删除BOM头(php)

    将下面文件放在网站根目录访问即可,它会遍历当前目录下所有子目录,检测文件是否含有BOM头,并删除BOM头 <?php //remove the utf-8 boms //by magicbug ...

  2. python对MySQL进行添加修改删除以及字符串的操作

    # coding=UTF-8 import MySQLdb def dbDperate(sql,param): "定义数据库的添加,修改和删除操作" #获取数据库的连接对象 con ...

  3. 删除UTF-8 BOM头的GUI小工具

    经常看到PHP群里有人因为UTF-8的BOM头出现这样那样的问题,给出的一个PHP删除BOM头的程序,新手也不会用,所以用wxpython写了一 个GUI,直接选择文件夹路径,就可以将该文件夹下所有指 ...

  4. linux下查找包含BOM头的文件和清除BOM头命令

    查找包含BOM头的文件,命令如下:   grep -r -I -l $'^\xEF\xBB\xBF' ./   这条命令会查找当前目录及子目录下所有包含BOM头的文件,并把文件名在屏幕上输出.   但 ...

  5. python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)

    day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...

  6. Python实现单链表数据的添加、删除、插入操作

    Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...

  7. ORM简介 单表添加修改删除表记录

    ---------------------------------------------------------------目标既定,在学习和实践过程中无论遇到什么困难.曲折都不灰心丧气,不轻易改变 ...

  8. Ansible 从MySQL数据库添加或删除用户

    mysql_user - 从MySQL数据库添加或删除用户. 概要 要求(在执行模块的主机上) 选项 例子 笔记 状态 支持 概要 从MySQL数据库添加或删除用户. 要求(在执行模块的主机上) My ...

  9. Ansible 从远程主机添加或删除MySQL数据库

    mysql_db - 从远程主机添加或删除MySQL数据库. 概要 要求(在执行模块的主机上) 选项 例子 笔记 状态 支持 概要 从远程主机添加或删除MySQL数据库. 要求(在执行模块的主机上) ...

随机推荐

  1. Sums gym100753M

    Sums gym100753M 同余最短路模板,然而这个东西貌似也可以做去年D1T2 首先我们选择一个模数作为基准,然后剩下的这样连边: 对于一个面值为 x 的硬币 ,当前在 u 这个点(感性理解一下 ...

  2. nginx_access_log的格式设置

    log_format <NAME> <Strin­­­g>; 关键字 格式标签 日志格式 关键字:其中关键字error_log不能改变 格式标签:格式标签是给一套日志格式设置一 ...

  3. python第三天 列表和元组

    枚举 for in enumerate 循环输出字符串的内容并且输出它的索引信息: #判断索引为5的字符串是不是"您" is in Python提供了⼤量的内置数据结构,包含了列表 ...

  4. 日常Java 2021/11/13

    Java Applet基础 Applet是一种Java程序.它一般运行在支持Java的Web浏览器内.因为它有完整的Java API支持,所以Applet是一个全功能的Java应用程序.如下所示是独立 ...

  5. Spark Stage 的划分

    Spark作业调度 对RDD的操作分为transformation和action两类,真正的作业提交运行发生在action之后,调用action之后会将对原始输入数据的所有transformation ...

  6. [php代码审计] 通读审计之shangfancms

    前言 大部分的MVC框架,访问的控制器大部分是由外部参数来决定的,那么本篇文章所通读的MVC框架与之前的一系列MVC框架不太一样,它的路由是由程序本身的路由表来决定的. 源码下载 https://ww ...

  7. Java文件操作(求各专业第一名的学生)

    两个文件:info.txt 存放学生基本信息 学号 学院 专业 姓名 1001 计算机学院 软件工程 刘月 1002 生物工程 服装设计 孙丽 score.txt存放分数信息 学号 学科 成绩 100 ...

  8. RestTemplate的exchange()方法,解决put和delete请求拿不到返回值的问题

    嗷嗷待哺的controller(被调用provider的controller方法) //测试get少量参数 @RequestMapping(value = "detailsGetD" ...

  9. linux系统下命令的学习

    本博客是本人工作时做的笔记 ps aux |grep ^profile |grep A190200024 ^ 表示行首匹配 linux查看文件大小: 具体可查看:https://www.cnblogs ...

  10. Linkerd Service Mesh 授权策略(Server & ServerAuthorization)

    简介 Server 和 ServerAuthorization 是 Linkerd 中的两种策略资源, 用于控制对 mesh 应用程序的入站访问. 在 linkerd 安装期间,policyContr ...