我目前正在开发我的第一个Python项目,我需要解析一个2GB的文件。 我发现如果我一行一行就会非常慢...... 但是缓冲方法,使用:
f = open(filename)
lines = 0
buf_size = 1024 * 1024
read_f = f.read
buf = read_f(buf_size)
while buf:
for line in buf:
#code for string search
print line
buf = read_f(buf_size)
此处打印行不打印“行”,它每行仅打印一个字符。所以我在查找子字符串时遇到问题...... 请帮助!
答案 0 :(得分:1)
print line
打印一个字符,因为buf
是一个字符串,并且在字符串上迭代会将字符串的字符生成为1个字符的字符串。
当你说逐行阅读时,你是如何实现阅读的?如果你使用readlines(),这将解释缓慢(见http://stupidpythonideas.blogspot.com/2013/06/readlines-considered-silly.html)。
文件可以通过它们的行进行迭代,Python会在迭代时选择一个缓冲区大小,因此这可能符合您的需求:
for line in f:
# do search stuff
如果要手动指定缓冲区大小,也可以这样做:
buf = f.readlines(buffersize)
while buf:
for line in buf:
# do search stuff
buf = f.readlines(buffersize)
虽然,两者中的第一个通常更好。
答案 1 :(得分:0)
问题是buf是一个字符串......
说buf =“abcd”
这意味着,buf [0] = a,buf [1] = b等等。
for line in buf:
print line
会导致 一个 b C d
这意味着在你的for循环中,你不会遍历“lines”,而是遍历buf-string的所有元素。您可以通过查找“\ n”来使用读取线或将缓冲区拆分为单行。