这是我第一次发帖提问,所以如果我犯了任何错误,我会提前道歉。
我目前正在尝试创建一个自定义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
解决了文件顶部和底部的问题,但我仍然在努力
我已经看到了一些删除行/覆盖行的解决方案,但是我没有足够的内存,因此我必须保持开/关/写入最小化。非常感谢任何和所有帮助。
答案 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")