2017-04-11 92 views
1

目前我正在處理一個CSV文件程序,我必須將CSV文件分割成不重疊的部分(按行),但不應在磁盤中創建任何額外的文件。CSV文件行遞增

目前我使用這個程序來讀取CSV文件中按行的特定部分:

def dataFromFile(fname): 
    record = [] 
    count=0 
    with open(fname, 'rb') as f: 
     reader = csv.reader(f) 
     for row in reader: 
      while '' in row: 
        row.remove('') 
      count+=1 
      record.append(row) 
    print count 
    return record[0:4] 

在這裏,我能夠在0-4的範圍內讀取行。 但是有沒有可能使這個自動化,也就是說,我們可以不需要手動給出這個範圍,而是每次讀取下一行4行,直到CSV文件結束爲止。

CSV文件包含:

apple beer rice chicken 
apple beer rice  
apple beer   
apple mango  
milk beer rice chicken 
milk beer rice  
milk beer   
milk mango  
+0

您能給出一個具體的輸入CSV文件的例子和預期的結果嗎? – mkrieger1

+0

''''應該是什麼意思? – mkrieger1

+0

@ mkrieger1''是列表中的空白空間。示例csv文件包含沒有任何標籤或標題的市場的交易數據。 – Knox

回答

1

您可以使用yield

def dataFromFile(fname): 
    record = [] 
    print'Opening the file is executed once' 
    count = 0 
    with open(fname) as f: 
     for row in csv.reader(f, delimiter=' '): 
      count += 1 
      fields = [field for field in row if field] 
      if fields: 
       record.append(fields) 
      if len(record) == 4: 
       print 'Last yielded row:', count 
       yield(record) 
       record = [] 
    if record: 
     yield record 

而且呼叫

for row in dataFromFile('your.csv'): 
    print row 

從解釋

>>> import csv 
>>> 
>>> def dataFromFile(fname): 
    record = [] 
    print 'Opening the file is executed once' 
    count = 0 
    with open(fname) as f: 
     for row in csv.reader(f, delimiter=' '): 
      count += 1 

      fields = [field for field in row if field] 
      if fields: 
       record.append(fields) 
      if len(record) == 4: 
       print 'Last yielded row:', count 
       yield(record) 
       record = [] 
    if record: 
     yield record 
... 
>>> for row in dataFromFile('your.csv'): 
...  print row 
... 
Opening the file is executed once 
Last yielded row: 4 
[['apple', 'beer', 'rice', 'chicken'], ['apple', 'beer', 'rice'], ['apple', 'beer'], ['apple', 'mango']] 
Last yielded row: 8 
[['milk', 'beer', 'rice', 'chicken'], ['milk', 'beer', 'rice'], ['milk', 'beer'], ['milk', 'mango']] 
>>> 
+0

感謝您的幫助。但我不想在閱讀一次後再讀第4行。我使用前4行作爲程序的輸入。我想排除它們,讀取下面的4行,將它們輸入到該程序中,併爲接下來的行數做相同的操作。 – Knox

+0

我不熟悉發電機。我會仔細看看的。謝謝。 – Knox

+0

record = []將記錄作爲列表。但收益率不適用於清單。 – Knox