以下代码只处理了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. 洛谷 P3600 - 随机数生成器(期望 dp)

    题面传送门 我竟然独立搞出了这道黑题!incredible! u1s1 这题是我做题时间跨度最大的题之一-- 首先讲下我四个月前想出来的 \(n^2\log n\) 的做法吧. 记 \(f(a)=\m ...

  2. Atcoder Grand Contest 008 E - Next or Nextnext(乱搞+找性质)

    Atcoder 题面传送门 & 洛谷题面传送门 震惊,我竟然能独立切掉 AGC E 难度的思维题! hb:nb tea 一道 感觉此题就是找性质,找性质,再找性质( 首先看到排列有关的问题,我 ...

  3. 【机器学习与R语言】6-线性回归

    目录 1.理解回归 1)简单线性回归 2)普通最小二乘估计 3)相关系数 4)多元线性回归 2.线性回归应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理 ...

  4. TP、PHP同域不同子级域名共享Session、单点登录

    TP.PHP同域不同子级域名共享Session.单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录. PHP支持通过设置coo ...

  5. 简易kmeans-c++版本

    typedef double dtype; 主要接口: void Kmeans(const vector<vector<dtype> > &d,int k,string ...

  6. mac系统升级导致VirtualBox报Kernel driver not installed (rc=-1908)

    一.背景 最近将我的Mac升级成了Monterey版本,结果发现之前的安装的VirtualBox虚拟机无法启动,报了如下错误. Kernel driver not installed (rc=-190 ...

  7. 巩固javaweb的第二十四天

    巩固内容: 提示用户信息 在验证失败之后通常需要提示用户错误信息,可以通过下面的代码完成: alert("地址长度大于 50 位!"); 当使用 alert 提示错误信息时,参数是 ...

  8. 如何启动、关闭和设置ubuntu防火墙 (转载)

    引自:http://www.cnblogs.com/jiangyao/archive/2010/05/19/1738909.html 由于LInux原始的防火墙工具iptables过于繁琐,所以ubu ...

  9. Java打jar包详解

    Java打jar包详解 一.Java打jar包的几种方式https://www.cnblogs.com/mq0036/p/8566427.html 二.MANIFEST.MF文件详解https://w ...

  10. tomcat 8 内存优化

    在Linux环境下设置Tomcat JVM,在/opt/tomcat/bin/catalina.sh文件中找到"# ----- Execute The Requested Command&q ...