以下代码只处理了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. Atcoder Grand Contest 006 D - Median Pyramid Hard(二分+思维)

    Atcoder 题面传送门 & 洛谷题面传送门 u1s1 Atcoder 不少思维题是真的想不出来,尽管在 Atcoder 上难度并不高 二分答案(这我倒是想到了),检验最上面一层的数是否 \ ...

  2. 1D RKDG to shallow water equations

    RKDG to shallow water equations 1.Governing Equations \[\frac{\partial U}{\partial t} + \frac{\parti ...

  3. 【1】蛋白鉴定软件之X!Tandem

    目录 1. 简介 2.下载安装 3. 软件试用 4. 结果 5. FAQ 1. 简介 X!Tandem是GPM:The Global Proteome Machine(主要基于Web的开源用户界面,用 ...

  4. Linux-root管理员创建新用户

    Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...

  5. Oracle基础入门

    说明:钓鱼君昨天在网上找到一份oracle项目实战的文档,粗略看了一下大致内容,感觉自己很多知识不够扎实,便跟着文档敲了一遍,目前除了机械性代码没有实现外,主要涉及知识:创建表空间.创建用户.给用户赋 ...

  6. CSS3单行文本两端对齐

    CSS3实现单行文本两端对齐 p { height: 24px; text-align: justify; text-last-align: justify; } p::after { display ...

  7. 前端3 — js — BOM没完( 不了解也行 )

    1.js是什么? -- 英文全称javascript javaScript(简称"JS") 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言.虽然它是作为开发Web页面的脚 ...

  8. CAN总线常见的两种编码格式(Intel/Motorola)

    在汽车电子行业的开发或者测试中,我们经常会看到CAN总线信号的常见的两种编码格式:Intel格式与Motorola格式. 讲解这两种格式之前,我们先来了解一些大端模式和小端模式,会对后面理解这两种编码 ...

  9. 学习java 7.9

    学习内容: Date类 Date类常用方法 SimpleDateFormat 1.格式化(从Date到String) public final String format(Date date) 将日期 ...

  10. 超好玩:使用 Erda 构建部署应用是什么体验?

    作者|郑成 来源|尔达 Erda 公众号 导读:最近在 Erda 上体验了一下构建并部署一个应用,深感其 DevOps 平台的强大与敏捷,不过为了大家能够快速上手,我尽量简化应用程序,用一个简单的返回 ...