将\r文本转换为\n以使readlines()按预期工作

18

使用Python,您可以通过以下方式读取文件并将其行加载到列表中:

f = open('file.txt','r')
lines = f.readlines()
每行都以\n作为分隔符,但如果一行的内容中有\r,则不会将其视为新行。我需要将所有的\r替换为\n并获取正确的列表lines。 如果我在lines内部执行.split('\r'),我会得到嵌套的列表。
我考虑过打开文件,将所有的\r替换为\n,关闭文件,然后再次读取并使用readlines(),但这似乎很浪费。
我该如何实现这个功能?

实际上,如果您的文本中混合了"\n"和"\r"换行符,并且后者出现在由"\n"分隔的“真正”的行内部,那么在列表中嵌套列表对我来说似乎是正确的做法。 - Tim Pietzcker
2个回答

44
f = open('file.txt','rU')

这个代码使用Python的通用换行符支持打开文件,\r被视为行尾符。


4
根据Python文档,尽管该功能已被弃用且不应在新代码中使用。 - Tim Pietzcker
谢谢!这个按照预期工作,对我来说已经足够了。Tim,现在正确的做法是什么? - greye
3
在Python 3.x中,通用换行符支持默认开启,因此您无需执行任何操作。 - Jason Orendorff
很遗憾,这对我不起作用。每次在 Mac 上调用 readlines() 时,我的列表长度总是1! - fIwJlxSzApHEZIl
@advocate,你用的是哪个版本的Python?你最好开一个新问题,把你遇到的所有问题细节都写上。 - Ned Deily
2
发现了问题。readlines() 对我来说总是失败,但 read().split("\r") 执行相同的功能并且有效。同时 .split("\n") 在每个文件上也总是失败,可能是因为与 .readlines() 相同的原因。这让我花了几天时间才弄清楚!这是我第一次在 Mac 上专业工作,很不幸它让我绊了一段时间。这是 Python 2.7.5 在 OSX 10.9.1 上。以 'rU' 打开文件并没有解决我的换行符 / 回车符问题,很遗憾。 - fIwJlxSzApHEZIl

3
如果这是一个问题,以二进制格式打开并使用以下代码进行转换:
from __future__ import with_statement

with open(filename, "rb") as f:
    s = f.read().replace('\r\n', '\n').replace('\r', '\n')
    lines = s.split('\n')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接