在Python中通过大文件搜索字符串

时间:2013-10-03 15:24:41

标签: python parsing search find large-files

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

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

2 个答案:

答案 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”来使用读取线或将缓冲区拆分为单行。