python的codecs模块_Python:使用codecs模块进行文件操作及消除文件中的BOM
前言
此前遇到过UTF8格式的文件有无BOM的导致的问题,最近在做自动化测试,读写配置文件时又遇到类似的问题,和此前一样,又是折腾了挺久之后,通过工具比较才知道原因。
image
两次在一个问题上面栽更头,就在想有没有一个一劳永逸的方法避免这个问题,或者能做到检测,不用到最后借助Beyond Compare进行16进制比较。
Python codecs
此前很少使用codecs,查阅了相关资料知道这个是一个好东西。
比如说当我们有数据要保存的时候,大多数时候会选择保存到TXT中,当然数据量大的时候,保存到数据库还是比较方便,然后在网络传输的时候需要序列号、json化。
而我们操作txt平常用得最多的就是open内置函数,或者file这个工厂函数,两者效果基本一样。
但是我们用open方法打开文件有时候会有一些问题,因为open打开文件只能写入str类型,而不会管字符串是什么编码方式。
例如这样是可以的,示例:
>>> fr = open('test.txt','a')
>>> line1 = "我爱祖国"
>>> fr.write(line1)
但是有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,此时写入open方式打开的文件就有问题了。示例:
>>> line2 = u'我爱祖国'
>>> fr.write(line2)
Traceback (most recent call last):
File "", line 1, in
fr.write(line2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
怎么办?我们可以将上面的line2编码成str类型。
操作步骤:先把原数据decode为unicode再encode为str,太麻烦了。。。
input文件(gbk, utf-8...) ----decode-----> unicode -------encode------> output文件(gbk, utf-8...)
其实Python提供了更简单的做法,那就是今天的主角codecs.open,示例:
>>> import codecs
>>> fw = codecs.open('test1.txt','a','utf-8')
>>> fw.write(line2)
>>>
没有报错,写入成功!
其实Python对多国语言的处理是支持的很好的,它可以处理当下任意编码的字符。
有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:
原有编码 -> 内部编码 -> 目的编码
而codecs提供的方法可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述 操作。相对内置的open()来说,这个方法不容易在编码上出现问题。所以,推荐大家在文件读写的时候使用codecs
检测及消除BOM
然后继续我们今天的另外一个主题,怎么样消除UTF-8文件中的名BOM(Byte Order Mark),十六进制编码(EF BB BF),博主的方法有些取巧但是也比较高效,主要用到了codecs的函数BOM_UTF8,如果发现BOM_UTF8,则直接改写文件内容。
示例代码:
import codecs
with open(config_path) as source_file:
data = source_file.read()
# remove BOM
if data[:3] == codecs.BOM_UTF8: # 判断是否为带BOM文件
data = data[3:]
with codecs.open(config_path) as dest_file:
dest_file.write(data)
相关读写模式
codecs有如下的读写模式,和open用法基本一致。
模式
描述
r
仅读,待打开的文件必须存在
w
仅写,若文件已存在,内容将先被清空
a
仅写,若文件已存在,内容不会清空
r+
读写,待打开的文件必须存在
w+
读写,若文件已存在,内容将先被清空
a+
读写,若文件已存在,内容不会清空
rb
仅读,二进制,待打开的文件必须存在
wb
仅写,二进制,若文件已存在,内容将先被清空
ab
仅写,二进制,若文件已存在,内容不会清空
r+b
读写,二进制,待打开的文件必须存在
w+b
读写,二进制,若文件已存在,内容将先被清空
a+b
读写,二进制,若文件已存在,内容不会清空
python的codecs模块_Python:使用codecs模块进行文件操作及消除文件中的BOM相关推荐
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- python logging日志分割_python logging日志模块以及多进程日志
本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...
- python必学的模块_Python常用的模块
模块和包 1.1模块介绍模块定义:一系列功能的集合体 模块使用: import导入模块 或者 from ... import... 导入模块 模块分类:内置模块 自定义模块 第三方模块 模块加载顺序: ...
- python的窗口处理模块_python的图像处理模块
除了opencv专门用来进行图像处理,可以进行像素级.特征级.语义级.应用级的图像处理外,python中还有其他库用来进行简单的图像处理,比如图像的读入和保存.滤波.直方图均衡等简单的操作,下面对这些 ...
- python的主要应用领域及常用的函数模块_python之常用模块篇5
一.日志模块,logging模块 1)logging模块简单使用,屏幕输出.默认级别30 import logging logging.debug('debug...') # 10logging.in ...
- python找不到os模块_python之os模块
在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这就依赖于os模块,所以今天整理下比较常用 ...
- python xlrd模块_python之xlrd模块
xlrd模块 一.xlrd模块 1.python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库,这两个适用于.xls格式有效 2. xlrd模块 ...
- python 导入包 作用域_Python 包、模块、函数、变量作用域
Python 项目的组织结构 - 包 -- 模块 --- 类 ---- 函数.变量 Python是利用包和模块来组织一个项目的. 包: 包的物理表现是一个文件夹,但是一个文件夹却不一定是个包,要想让个 ...
- python怎么导入os模块_python之os模块
在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这就依赖于os模块,所以今天整理下比较常用 ...
最新文章
- 对象的当前状态使该操作无效 说明: 执行当前 Web 请求期间,出现未处理的异常。...
- JAVA程序员面试题集合
- Oracle 用户,角色,权限等
- 004 classmates subject
- 成绩转换(百分制到五级制的转换)-(只作新手参考)
- AndroidStudio安卓原生开发_activity关闭的时候把数据传递给上一个activity---Android原生开发工作笔记93
- 《嵌入式系统Linux内核开发实战指南(ARM平台)》书评
- 21个非常实用的She脚本实例
- 旋转矩阵中6保6_双色球旋转矩阵公式中6保4的
- 为什么安监控需要公网ip_关于花生壳公网版和内网版应用场合的一些说明
- (使用python+adb)能实现王者荣耀自动刷金币?
- 哈商大计算机学院2号楼,王俊生_哈商大计算机学院_新浪博客
- Qt for iOS,Qt 与Objective C混合编程
- Android AMS(android 11)
- 什么是透传模块?为什么要透传?
- Boosting, Online Boosting,adaboost
- 【Wireshark系列十】wireshark怎么抓包、wireshark抓包详细图文教程
- 一周5G资讯 | 移动将与广电5G共建共享;诺基亚发布首款5G手机;铁塔今年5G投资170亿元...
- uniapp 安卓平台应用启动时读写手机存储、访问设备信息(如IMEI)等权限
- 钜大锂电池并联串联知识详解 并联串联注意事项18650
热门文章
- Python人生重开模拟器(高级版(升级))
- Python 打包工具 pyinstaller
- 125KHZ|134.2KHZ低频RFID玻璃管标签读写器编码器支持各类标签类型说明
- Java小项目——聊天室(多线程版本)
- 三国杀充值登陆服务器响应超时,[十周年][公告]11月6日活动更新延迟及充值活动异常问题补偿...
- Vue跨域请求post\get
- java 实现socks代理,包含sock4 sock5代理
- Redis使用Lua脚本:保证原子性【项目案例分享】
- 环信CEO专访:人工智能,别再担忧砸你饭碗要学会利用它!
- poj 1873 The Fortified Forest (位运算枚举 + 凸包周长)