2013-07-07 73 views
4

我需要通過逐行讀取python中的輸入文本文件。這意味着將文本文件逐行加載到內存中,而不是一次全部加載到內存中。但是我的行分隔符不是空格,它們是任意字符。更改python中字符串上「for each」循環的分隔符

這裏是行加載文件行上堆棧溢出的方法:

with open("log.txt") as infile: 
    for line in infile: 
     do_something_with(line) 

以上是完美的,但是我需要從空格分隔符更改爲一個不同的角色。

這怎麼辦?謝謝。

+0

我不關注。你的行分隔符不是'\ r \ n'或'\ n'? – BLaZuRE

+0

它們是一些任意字符,但不是\ r \ n或\ n或製表符。所以你是對的 –

+0

究竟是什麼性格?文件有多大? –

回答

5
import re 
def open_delimited(filename, delimiter, chunksize=1024, *args, **kwargs): 
    with open(filename, *args, **kwargs) as infile: 
     remainder = '' 
     for chunk in iter(lambda: infile.read(chunksize), ''): 
      pieces = re.split(delimiter, remainder+chunk) 
      for piece in pieces[:-1]: 
       yield piece 
      remainder = pieces[-1] 
     if remainder: 
      yield remainder 

for line in open_delimited("log.txt", delimiter='/'): 
    print(repr(line)) 
+0

很好地使用'iter'和sentinel。 –

+0

這很好,但我會添加一個方法來改變參數中的塊大小 – Jmac

+0

@Jmac:感謝您的建議。 – unutbu

1

Python對此沒有本地構造。你可以寫一個發生器,一次讀取一個字符,並累積它們,直到你有一個完整的分隔項。

def items(infile, delim): 
    item = [] 
    c = infile.read(1) 
    while c: 
     if c == delim: 
      yield "".join(item) 
      item = [] 
     else: 
      c = infile.read(1) 
      item.append(c) 
    yield "".join(item) 

with open("log.txt") as infile: 
    for item in items(infile, ","): # comma delimited 
     do_something_with(item) 

如果您以塊(例如64K左右)讀取文件並將其拆分,您將獲得更好的性能。然而,這樣做的邏輯更加複雜,因爲一個項目可能會被分割成多個塊,所以我不會在這裏進行討論,因爲我不能100%確定自己的理解正確。 :-)