我有一些文件有时带有奇怪的行尾字符,比如\r\r\n
。有了这个,它就像我想要的那样工作:
with open('test.txt', 'wb') as f: # simulate a file with weird end-of-lines
f.write(b'abc\r\r\ndef')
with open('test.txt', 'rb') as f:
for l in f:
print(l)
# b'abc\r\r\n'
# b'def'
我希望能够从字符串获得相同的结果。我考虑过splitlines
,但结果不一样:
print(b'abc\r\r\ndef'.splitlines())
# [b'abc', b'', b'def']
即使使用keepends=True
,结果也不一样
问题:如何与for l in f
和splitlines()
具有相同的行为?
链接:Changing str.splitlines to match file readlines和https://bugs.python.org/issue22232
注意:我不想把所有的东西都放在一个BytesIO
或StringIO
中,因为它有x0.5的速度性能(已经过基准测试);我想保留一个简单的字符串。所以它不是How do I wrap a string in a file in Python?的复制品
我会像这样迭代:
你为什么不把它分开呢:
如果您真的需要,您将丢失后面的
\n
,以后可以添加到每一行。在最后一行,需要检查是否真的需要它。像另一种带有发电机的变体。通过这种方式,它将对大型文件具有内存感知能力,并且语法与原始
for l in bin_split(input)
类似:有几种方法可以做到这一点,但没有一种特别快
如果要保留行尾,可以尝试
re
模块:如果需要结尾,并且文件非常大,则可能需要迭代:
如果您不需要结尾,那么您可以更轻松地完成:
如果只是迭代结果(或使用Python2),则可以省略
list()
部分:相关问题 更多 >
编程相关推荐