【问题标题】:how to efficiently process string in python line by line?如何有效地逐行处理python中的字符串?
【发布时间】:2012-04-13 22:54:54
【问题描述】:

我通过 HTTP 收到了一些多行数据并将其保存在一个字符串中。我只需要过滤包含特定关键字的行并将其写入文件。

如何在不消耗过多内存的情况下处理这些单独的行? IE。没有在换行符处拆分输入字符串然后处理列表?

也欢迎特定于 Jython 的解决方案。

【问题讨论】:

    标签: python jython multiline multilinestring


    【解决方案1】:

    我现在实际测试了在 Jython 中使用 data.split('\n')、re.finditer('.*?\n', data) 和 StringIO.readline() 的内存要求。我惊讶地发现 split() 并没有增加使用的内存(PS Old Gen),StringIO 排在第二位和第三位。

    Jython 2.5.1+:
      split()  +0 x data
      StringIO +2 x data
      re       +4 x data
    
    Jython 2.2.1:
      split()  +0 x data
      re       +2 x data
      StringIO +7 x data
    

    StringIO 在 .write() 调用之后没有使用额外的内存,即它似乎由 Jython 中的相同字符串支持。

    我没有测试速度。

    【讨论】:

      【解决方案2】:

      使用StringIO 模块将您的字符串作为类似文件的对象进行访问。然后你可以像对文件一样遍历行。

      【讨论】:

      • StringIO 在内存方面不一定比 .split() 好,因为它是可变的,它不一定由 same string 作为支持初始值。
      • @lvc: 不是真的。如果你不写它,它会保持相同的字符串。即使你写,如果你不读它也不会消耗更多的内存。如果您想确定,请检查源代码。只需创建 StringIO 对象并读取不需要额外的内存,我的测试证实了这一点。
      • 好的,看过 Jython 的源代码后,StringIO 模块似乎确实按照您的建议行事,但较新的 io.StringIO 类确实, Jython 的 cStringIO 实现也没有(我还没有检查 CPython 的 cStringIO)。
      【解决方案3】:

      由于str.split 没有迭代器版本,最好的办法是使用re 模块来模拟它:

      for line in re.finditer('.*?\n', data):
         # do stuff
      

      但是,请注意,与常规的 split 方法不同,这将保留尾随换行符。

      【讨论】:

        【解决方案4】:

        你可以尝试使用编译好的正则表达式python re

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-22
          • 1970-01-01
          • 2016-08-28
          • 2016-01-09
          • 1970-01-01
          • 1970-01-01
          • 2015-02-12
          相关资源
          最近更新 更多