2012-03-30 116 views
2

我通過HTTP收到了一些多行數據,並將它放在一個字符串中。我只需要過濾僅包含特定關鍵字的行並將其寫入文件。如何在python中逐行高效地處理字符串?

如何在不消耗過多內存的情況下處理這些單獨的行?即沒有拆分輸入字符串在換行符,然後處理列表?

也歡迎Jython特定的解決方案。

回答

0

我現在實際測試了在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中由相同的字符串支持。

我沒有測試速度。

1

由於是str.split沒有迭代版本,最好的辦法是使用re模塊效仿:

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

但是請注意,這將會留下尾隨的換行符,這與常規的split方法不同。

0

使用StringIO模塊作爲文件類對象訪問您的字符串。然後,您可以像對文件一樣遍歷行。

+0

'StringIO'不一定比'.split()'更符合記憶性,因爲可變的,它不一定由*相同的字符串*作爲初始值傳遞它。 – lvc 2012-03-30 11:01:04

+0

@lvc:不是。如果你不寫它,它保持相同的字符串。即使你寫了,如果你沒有閱讀它也不會消耗更多的內存。如果您想確定,請查看源代碼。只需創建'StringIO'對象並閱讀並不需要額外的內存,我的測試證實了這一點。 – Avaris 2012-03-30 12:09:04

+0

好了,查看了Jython的源代碼後,似乎'StringIO'模塊確實按照您的建議行事,但是新的'io.StringIO'類不*,並且Jython沒有'cStringIO'的實現(我沒有檢查CPython的'cStringIO')。 – lvc 2012-03-30 12:45:40