【发布时间】:2015-10-11 12:22:24
【问题描述】:
这是我第一次发布问题,如果我犯了任何错误,请提前道歉。
我目前正在尝试创建一个自定义 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 行”
- 删除“字段”,即: ['fields','title1', 'title2', 'title3']----->['title1', 'title2', 'title3']
我已经看到了一些删除行/覆盖行的解决方案,但是,我没有太多可用的内存,因此我必须将打开/关闭/写入保持在最低限度。非常感谢任何和所有帮助。
【问题讨论】:
-
我们不知道是什么决定了应该包含还是排除一行。
-
那么为什么不直接使用
if row[0] == 'fields': row = row[1:]和if row[0] == 'data_type': continue? -
您可以使用
itertools.ifilterfalsedocs.python.org/2/library/itertools.html#itertools.ifilterfalse 进一步过滤您的迭代。 -
一个示例 csv 文件可能有助于更好地理解问题。您可以删除“for”循环中的 data_type 行,对吗?从 for 循环中的列表中删除项目以及使用 : if 'fields' in mylist: mylist.remove('fields')