python:如何删除行并从CSV修改特定的列表字符串

时间:2015-07-21 20:50:39

标签: python parsing 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 line”
  • 删除'fields',即: ['fields','title1','title2','title3'] -----> ['title1','title2','title3']

我已经看到了一些删除行/覆盖行的解决方案,但是我没有足够的内存,因此我必须保持开/关/写入最小化。非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分: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")