在Linux中使用Python正确读取换行符
在Windows系统中,如果我用Python的“for line in file”这种写法来读取普通文本文件的内容,最后一行通常不会以换行符结束,但之前的所有行都会有换行符。而在Linux系统中,这种情况似乎不同——当我逐行读取文件并打印内容时,我发现最后一行总是以换行符结束,即使在真实的文件中并没有这个换行符!我也试过使用file.readline()这个函数,结果也是一样。
(我假设这个文本文件确实没有以换行符结束。如果有的话,Linux会在文件末尾打印出两个换行符,而不是只有一个。)
我的代码非常简单。问题是它在Linux和Windows上产生的结果不同。
with open(path, 'r') as file:
for line in file:
print('>', line, '<', sep='')
'''
# Alternate method:
while True:
line = file.readline()
if not line:
break
print('>', line, '<', sep='')
'''
在Linux(准确来说是Ubuntu 13.10)上,最后一行总是会多出一个换行符。我在Python 2和3中都试过。有人知道这是怎么回事吗?
2 个回答
2
那如果去掉换行符呢?这就是你想要的效果吗?
with open('/Users/sebastian/Desktop/Untitled.txt', 'r') as file:
for line in file:
line = line.strip()
if line:
print('>', line, '<', sep='')
打印输出
>This is the first line<
>this is the second line<
>this is the third line<
PS:如果你的文本文件中间有空行,使用你提到的另一种方法可能会遇到问题。
编辑
可以看看 PEP278。在你的情况下,使用'U'模式可能会有帮助。
with open('/Users/sebastian/Desktop/Untitled.txt', 'rU') as file:
for line in file:
line = line.strip()
print('>', line, '<', sep='')
打印输出
>This is the first line<
>this is the second line<
><
>this is the fourth line (blank line above)<
><
另外,你还可以添加一个特定于平台的额外行,比如通过
import platform
if platform.system()=='Windows':
# do sth
else:
# do sth
2
在Linux系统中,每个文本文件都是由一系列的行组成,并且最后必须有一个换行符。如果一个文件没有以换行符结束,Linux就不会把它当作文本文件来处理。这一点在Linux使用的POSIX文件系统中有明确规定。
3.206 Line
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.
所以,这并不是你代码的问题,而是Linux文件系统的规定。你可以简单地去掉你从文件中读取的字符串末尾的换行符。