Python换行符问题:rn还是n?
程序员文章站
2022-03-09 14:12:31
...
执行以下Python代码:
fn = 'test.txt'
file(fn, 'w+').write('test\ntest2')
content = file(fn, 'r').read()
print content.replace('\r', '\\r').replace('\n', '\\n')
打印的结果不依赖平台,都是:
test\ntest2
但是test.txt的内容却依赖平台而变化(用notepad++、vi等程序查看):
windows下是:test\r\ntest2
linux下却是:test\ntest2
我想问的问题是,如何保证Python写入文件的'\n'字符不随平台变化,即保证一定是'\n'?
解决方法:
Python 2
(PEP 278 -- Universal Newline Support,感谢毕勤的补充):
1)如果不是txt文件,建议用wb和rb来读写。通过二进制读写,不会有换行问题。
2)如果需要明文内容,请用rU来读取(强烈推荐),即U通用换行模式(Universal new line mode)。该模式会把所有的换行符(\r \n \r\n)替换为\n。只支持读入,但是也足够了。这是Python 提供给我们的最好的选择,没有之一。
对比r和rU的结果:
[1]: http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files python可以根据系统自动选择换行符,只要使用 os.linesep 就可以判断出来 这不是python的问题,windows的换行是\r\n,unix的是\n,mac的是\r。 回答除了第一个都略微偏题了. 个人习惯来说,当编辑文件时,尽量使用二进制格式,这样会避免跨平台时出错. 根本不需要知道每个平台是\r,还是\n. 只要养成 rb,wb等习惯就行了. Rio 就是一个很好的编程习惯. 不特别指定的话,python会自适应各个平台的差异,比如\n 和 \r\n的不同。
想达到楼主的目地,可以用二进制模式打开和操作文件即可。 现在这个答案已经错了0.0,正确如下(在不可预见的未来,这个答案也很可能错了,期待有人@我)。
在远古时代:windows的换行是\r\n,unix的是\n,mac的是\r完全正确!
Mac OS 9 以及之前的系统的换行符是 CR(\r),从 Mac OS X (后来改名为“OS X”)开始的换行符是 LF(\n)。
参考Did Mac OS Lion switch to using line feeds (LF '\n') for line breaks instead of carriage returns (CR '\r')? 我知道的一点是:CLRF结尾的文件可以用【dos2unix】命令转换为RF结尾的文件。
fn = 'test.txt'
file(fn, 'w+').write('test\ntest2')
content = file(fn, 'r').read()
print content.replace('\r', '\\r').replace('\n', '\\n')
打印的结果不依赖平台,都是:
test\ntest2
但是test.txt的内容却依赖平台而变化(用notepad++、vi等程序查看):
windows下是:test\r\ntest2
linux下却是:test\ntest2
我想问的问题是,如何保证Python写入文件的'\n'字符不随平台变化,即保证一定是'\n'?
回复内容:
章硕,js & python这是一个很经典的问题。因为不同系统下默认的换行符不同。字符处理时候,这样的“不同”会带来很大的问题,例如line[-2]和line.strpi()会因为平台不同返回不同的值。
夏一一、乔3少 赞同
这不是python的问题,windows的换行是\r\n,unix的是\n,mac的是\r。
解决方法:
Python 2
(PEP 278 -- Universal Newline Support,感谢毕勤的补充):
1)如果不是txt文件,建议用wb和rb来读写。通过二进制读写,不会有换行问题。
2)如果需要明文内容,请用rU来读取(强烈推荐),即U通用换行模式(Universal new line mode)。该模式会把所有的换行符(\r \n \r\n)替换为\n。只支持读入,但是也足够了。这是Python 提供给我们的最好的选择,没有之一。
对比r和rU的结果:
content = file(fn, 'r').read()
# test\r\ntest2
# 这里的换行会因不同系统而不同
file(fn, 'w+').write('test\ntest2')
改成file(fn, 'wb+').write('test\ntest2')
就行了。Windows 平台上 Python 区分 Binary 和 ASCII 模式。ASCII 模式下换行符会在读写时自动换为 \r\n (详见 [1])。*nix 平台下没有这个区别。[1]: http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files python可以根据系统自动选择换行符,只要使用 os.linesep 就可以判断出来 这不是python的问题,windows的换行是\r\n,unix的是\n,mac的是\r。 回答除了第一个都略微偏题了. 个人习惯来说,当编辑文件时,尽量使用二进制格式,这样会避免跨平台时出错. 根本不需要知道每个平台是\r,还是\n. 只要养成 rb,wb等习惯就行了. Rio 就是一个很好的编程习惯. 不特别指定的话,python会自适应各个平台的差异,比如\n 和 \r\n的不同。
想达到楼主的目地,可以用二进制模式打开和操作文件即可。 现在这个答案已经错了0.0,正确如下(在不可预见的未来,这个答案也很可能错了,期待有人@我)。
在远古时代:windows的换行是\r\n,unix的是\n,mac的是\r完全正确!
Mac OS 9 以及之前的系统的换行符是 CR(\r),从 Mac OS X (后来改名为“OS X”)开始的换行符是 LF(\n)。
参考Did Mac OS Lion switch to using line feeds (LF '\n') for line breaks instead of carriage returns (CR '\r')? 我知道的一点是:CLRF结尾的文件可以用【dos2unix】命令转换为RF结尾的文件。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
上一篇: python中列表长度可变吗
下一篇: mysql创建索引有什么技巧
推荐阅读
-
Python解决N阶台阶走法问题的方法分析
-
用Python解决x的n次方问题
-
浅谈Python采集网页时正则表达式匹配换行符的问题
-
python按行读取文件,去掉每行的换行符\n的实例
-
python 非递归解决n皇后问题的方法
-
搜了N变教程,还是没配置好apache 虚拟目录 伪静态,求大家帮忙看下问题出在哪
-
用Python解决x的n次方问题
-
浅谈Python采集网页时正则表达式匹配换行符的问题
-
解析PHP处理换行符的问题 rn
-
新手入门 在Notepad++中写入python代码 运行后只是一闪而过 在末尾加了raw_input() helloworld这样的程序可以解决问题 但有些还是不能 求助?