我有一个文本文件,其中包含\n
和\r\n
两种行尾标记。我想只在\r\n
处进行拆分,但是使用Python的readlines方法无法实现。是否有简单的解决方法?
我有一个文本文件,其中包含\n
和\r\n
两种行尾标记。我想只在\r\n
处进行拆分,但是使用Python的readlines方法无法实现。是否有简单的解决方法?
正如 @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.'
\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的示例。您可以在split
之前或之后将字节解码为Unicode。)
您可以避免将整个文件读入内存,而是分块读取它。但是,正确处理行变得有点复杂(您必须手动检查上一行从哪里开始,并将其与下一个块连接起来)。
r
和rU
模式将具有不同的行为(前者仅在操作系统本地换行符上拆分行,而后者将产生上面显示的结果)。ifs = open(myFile)
for chunk in ifs.read().split(mySep):
#do something with the chunk
不要使用readline,直接使用read和split。
例如:
with open('/path/to/file', 'r') as f:
fileContents = f.read() #read entire file
filePieces = fileContents.split('\r\n')
io.open
是 Python 3 中内置的open
函数。在 Python 2 中,你只需要在io
模块中查找它即可。 - Blckknght