2015-07-21 78 views
2

這是我第一次發佈問題,所以如果我犯了錯誤,我提前道歉。python:如何刪除行並從CSV中修改特定的列表字符串

我目前試圖創建一個自定義的Python程序(幾乎解析器),在數據呈現爲這樣:

junk 
junk 
junk 
junk 
junk 
junk 
fields  title title title 
data_type d_type d_type d_type 
data1 data2 data 3 
data4 data 5 data6 
data7 data8 data9 
junk 

凡我所期望的輸出是:

title title title 
data1 data2 data3 
data4 data5 data6 
data7 data8 data9 

這裏是我的代碼的工作部分,我到目前爲止:

import csv 
import itertools 
with open('file.log','rb') as csvfile: 
    rowlist = csv.reader(csvfile, delimiter = '\t') 
    for row in itertools.islice(rowlist,6,12): 
    print row 

每當上面的代碼運行它產生一系列列表作爲列表這裏

['fields','title1', 'title2', 'title3'] 
['data_type','d_type','d_type', 'd_type'] 
['data1', 'data2', 'data3'] 
['data4', 'data5', 'data6'] 
['data7', 'data8', 'data9'] 

的第一數據條目(DATA1,DATA4,DATA7)觀察始終是一個數,而其它數據項可以是任意字符串/數字/字符。

itertools解決了切斷文件的頂部和底部,但是我仍然在努力

  • 刪除「DATA_TYPE線」
  • 刪除「領域」,那就是: [」字段','title1','title2','title3'] -----> ['title1','title2','title3']

我看到一些解決方案,刪除行/覆蓋但是,我沒有太多的內存空間,因此我必須保持打開/關閉/寫入最低限度。任何和所有的幫助是非常感謝。

+1

我們h我們不知道是否應該包含或排除一行。 – TigerhawkT3

+2

那麼,爲什麼不行'if row [0] =='fields':row = row [1:]'和'if row [0] =='data_type':continue'? –

+0

您可以使用'itertools.ifilterfalse'進一步過濾您的迭代器https://docs.python.org/2/library/itertools.html#itertools.ifilterfalse。 – Scott

回答

0

只是切片中的每一行:

for row in islice(rowlist, 6, 12): 
    if row[0] == "data_type": 
     continue 
    elif row[0] == "fields": 
      print(row[1:]) 
    else: 
     print(row) 

如果你只是寫行再次使用islice:

for row in islice(rowlist, 6, 12): 
    if row[0] == "data_type": 
     continue 
    elif row[0] == "fields": 
     fileobj.write(islice(rowlist, 1,None)) 
    else: 
     fileobj.write(row) 

如果你實際上是試圖覆蓋原文件,你可以寫的行一個tempfile並用shutil.move替換原始文件:

from shutil import move 
from tempfile import NamedTemporaryFile 

with open('file.csv', 'rb') as csvfile, NamedTemporaryFile(dir=".", delete=False) as temp: 
    rowlist = csv.reader(csvfile) 
    for row in islice(rowlist, 6, 12): 
     if row[0] == "data_type": 
      continue 
     elif row[0] == "fields": 
      temp.write(islice(rowlist, 1, None)) 
     else: 
      temp.write(row) 

move(temp.name,"file.csv") 
+0

只有一行需要刪除第一列。 –

相關問題