0

我目前正在处理我的第一个 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)

这里的打印行不打印“行”,它每行一次只打印一个字符。所以我在查找子字符串时遇到问题...请帮助!

4

2 回答 2

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)

不过,两者中的第一个通常更好。

于 2013-10-03T15:57:34.827 回答
0

问题是 buf 是一个字符串......

说 buf = "abcd"

这意味着,buf[0] = a,buf[1]=b 等等。

for line in buf:
    print line

将导致 a b c d

这意味着在您的 for 循环中,您不会遍历“行”,而是遍历 buf 字符串的所有元素。您可以使用 readlines 或通过查找“\n”将缓冲区拆分为单行。

于 2013-10-03T16:06:09.797 回答