我有一个包含\n
和\r\n
行尾标记的文本文件。我想只在\r\n
上拆分,但是无法用python的readlines方法找到一种方法。有一个简单的解决方法吗?
答案 0 :(得分:9)
正如@eskaev所提到的,如果没有必要,你通常会希望避免将完整的文件读入内存。
io.open()
允许您指定newline
关键字参数,因此您仍然可以迭代行并让它们在指定的换行符处仅拆分
import io
for line in io.open('in.txt', newline='\r\n'):
print repr(line)
输出:
u'this\nis\nsome\r\n'
u'text\nwith\nnewlines.'
答案 1 :(得分:3)
避免在文本模式下阅读。 Python使用universal newline support读取文本文件。这意味着所有行结尾都被解释为\n
:
>>> with open('out', 'wb') as f:
... f.write(b'a\nb\r\nc\r\nd\ne\r\nf')
...
14
>>> with open('out', 'r') as f: f.readlines()
...
['a\n', 'b\n', 'c\n', 'd\n', 'e\n', 'f']
请注意,使用U
并不会更改结果 1 :
>>> with open('out', 'rU') as f: f.readlines()
...
['a\n', 'b\n', 'c\n', 'd\n', 'e\n', 'f']
但是,您始终可以在二进制模式下读取文件,对其进行解码,然后在\r\n
上拆分:
>>> with open('out', 'rb') as f: f.read().split(b'\r\n')
...
[b'a\nb', b'c', b'd\ne', b'f']
(python3中的示例。您可以在decode
之前或之后将字节split
转换为unicode。
您可以避免将整个文件读入内存并以块的形式读取。然而,正确处理这些行变得有点复杂(你必须手动检查最后一行的起始位置并将其连接到下一个块)。
1 我相信它是因为在所有正常安装中默认启用通用换行符。您必须在配置安装时明确禁用它,然后然后 r
和rU
模式将有不同的行为(第一个只会拆分OS本机行结尾的行,后者会产生上面显示的结果。
答案 2 :(得分:0)
不使用readline,只需使用read和split。
例如
with open('/path/to/file', 'r') as f:
fileContents = f.read() #read entire file
filePieces = fileContents.split('\r\n')
答案 3 :(得分:0)
此方法将文件读取为由分隔符拆分的块中的生成器。
ifs = open(myFile)
for chunk in ifs.read().split(mySep):
#do something with the chunk