飘逸的python - 不要用二进制模式打开文本文件
来源:互联网 发布:凸包问题的分治算法 编辑:程序博客网 时间:2024/05/17 02:32
先看下面代码的“诡异”现象。
假设在windows下,我有个f.txt文件,里面的内容是下面这样的。
hello
world
代码一,
with open('f.txt', 'r') as f: print f.readlines()with open('f.txt', 'rb') as f: print f.readlines()
输出
['hello\n', 'world\n']
['hello\r\n', 'world\r\n']
代码二,
with open('f.txt', 'rb') as f: data = f.read()with open('f.txt', 'w') as f: f.write(data)
打开文件,变成了下面这样,
hello^M
world^M
首先,先理解换行符'\n'跟回车符'\r'的概念。
'\n',换行符(LF,Line-Feed ),指新的一行。
'\r',回车符(CR,Carriage-Return),指回到行头。
因为在不同系统下的换行标识是不一样的。
windows->'\r\n'
unix->'\n'
mac->'\r'
这就是为什么windows下的txt在linux打开的时候行尾会有'^M'。
这就是为什么我在linux下跑脚本导出游戏数据下到本地windows打开变成了一行。
其实文本文件也是二进制文件,是文本编码的二进制文件,文本文件对一些不可见字符进行了处理,增加可读性。
在python中,可以通过os.linesep获得当前系统的换行标识。比如在windows下,os.linesep是'\r\n'。
在python中操作换行标识的时候,并不用管是在什么平台下,直接用'\n'就行了,python会自动根据不同系统转成不同标识。
有了上面这些理论依据,就可以解析本文开头代码的“诡异”现象了。
代码一中,用文本模式打开的文件,换行标识会被python处理成'\n',而用二进制模式打开则原封不动。
代码二中,用二进制模式打开,用文本模式写入。二进制打开原封不动还是'\r\n',而文本模式写入的时候因为python会把'\n'转成'\r\n',所以其实就等于是写入了'\r\r\n',于是就多了个'^M'。
- 飘逸的python - 不要用二进制模式打开文本文件
- 飘逸的python - 理解打开文件的模式
- 飘逸的python - 单例模式乱弹
- 飘逸的python
- 飘逸的python
- 飘逸的python
- 飘逸的python
- C/C++/Python等 使用二进制模式打开文件与不使用二进制模式的区别
- 飘逸的python - 赛程表算法
- 飘逸的python - 赛程表算法
- 飘逸的python - and_or大法
- 二进制文本文件的读取
- 飘逸的python - 常见的几个坑
- 飘逸的python - __dict__的妙用
- 飘逸的python - 优雅的执行程序
- 飘逸的python - 彩色你的控制台
- 飘逸的python - 鲜为人知的参数
- 飘逸的python - 装饰器的本质
- 多态性复习
- URAL 1931 Excellent Team 解题报告
- oracle中特殊字符的模糊查询
- linux学习之----ubuntu12.04下载地址之一
- oracle 查看用户表,存储过程,触发器,函数对象
- 飘逸的python - 不要用二进制模式打开文本文件
- JavaScript 框架比较
- hdu1412 搬寝室
- DELPHI读取网页源文件和获取字符串
- struts2执行流程及环境搭建
- hdu 2546 0-1背包问题
- JSON 对象的解析方式
- 解决Unity3D中文乱码问题
- android listView-simpleadapter(点击事件)