Home  >  Article  >  Backend Development  >  Python换行符问题:rn还是n?

Python换行符问题:rn还是n?

WBOY
WBOYOriginal
2016-06-06 16:23:413347browse

执行以下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'?

回复内容:

章硕,js & python
夏一一、乔3少 赞同
这不是python的问题,windows的换行是\r\n,unix的是\n,mac的是\r。
这是一个很经典的问题。因为不同系统下默认的换行符不同。字符处理时候,这样的“不同”会带来很大的问题,例如line[-2]和line.strpi()会因为平台不同返回不同的值。

解决方法:
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]: docs.python.org/tutoria 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结尾的文件。
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn