代码之家  ›  专栏  ›  技术社区  ›  Mojing Liu

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

  •  0
  • Mojing Liu  · 技术社区  · 11 年前

    我目前正在进行我的第一个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 回复  |  直到 11 年前
        1
  •  1
  •   Cookyt Roberto    11 年前

    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)
    

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

        2
  •  0
  •   PhillipD    11 年前

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

    说buf=“abcd”

    这意味着,buf[0]=a,buf[1]=b,依此类推。

    for line in buf:
        print line
    

    将导致 一 b c d

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