【发布时间】:2018-11-04 14:25:05
【问题描述】:
我只想读取由换行符 \r\n 确定的文件,\r 和 \n 应该被视为字符串的一部分,而不是行尾。
我正在尝试使用
open('file.txt', 'rU').read().split('\r\n')
但是打开文件后我看不到任何 \r 字符,所以可能我必须用不同的标志或不同的方式打开文件。
任何想法如何解决这个问题?
编辑:抱歉没有指定 python 的版本,我使用的是版本 3。
【问题讨论】:
我只想读取由换行符 \r\n 确定的文件,\r 和 \n 应该被视为字符串的一部分,而不是行尾。
我正在尝试使用
open('file.txt', 'rU').read().split('\r\n')
但是打开文件后我看不到任何 \r 字符,所以可能我必须用不同的标志或不同的方式打开文件。
任何想法如何解决这个问题?
编辑:抱歉没有指定 python 的版本,我使用的是版本 3。
【问题讨论】:
用'rb'打开文件:
open('file.txt', 'rb').read().split('\r\n')
我发现创建一个只有 CR 和 LF 的文本文件有点挑战,但 Notepad++ 帮助了我。
有了这个内容:
CRLF\r\nCR\rLF\nCRLF\r\n
使用print open('file.txt', 'rb').read().split('\r\n')
我得到了这个输出:
['CRLF', 'CR\rLF\nCRLF', '']
【讨论】:
.read().decode().split... 例如。
barny answer(使用二进制模式)在 Python 2 中完美运行,但需要在 Python 3 中进行调整,因为以二进制形式打开文件会返回其内容为 bytes,而不是 str。
此外,如果文件很大,一次读取整个文件的事实可能是内存方面的问题。
在 Python 3 中,您可以将 newline 参数传递给 open,因此它会根据该参数而不是默认值进行拆分。
with open("temp.txt","r",newline="\r\n") as f:
for line in f:
....
line 包含文本加上末尾的\r\n(使用line = line.rstrip() 删除)。
如果行中有\n 字符(不在\r 后面),则将它们作为普通字符读取。
【讨论】:
decode 的评论甚至不在答案中,您都解决了这个问题)。此外,尝试使用其他解决方案打开一个 30Gb 文件,并在开始时执行完整的读取 + 拆分:)
我认为在文本模式下读取文件时,\r\n 正在被翻译为 \n。
我不是 100% 确定你想要达到什么目标,但在我看来你想要做什么:
with open("file.txt", "rU") as f:
return f.readline()
这将读取一行(包括 \n)。如果您希望将行作为列表:
with open("file.txt", "rU") as f:
return f.readlines()
或者你可以只迭代 f。
【讨论】: