在Python中循环解析复杂的制表符分隔/CSV文件

3

请注意,我很新手,并且正在使用Python 3.3编程!现在,我有很多基本布局相同的文件。每个文件有9列,用制表符分隔,并且标题行数量不固定 - 大多数文件有五行标题。行和列都没有标题!

大致如下:

#header1
#header2
#header3
#header4
#header5
ID1    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes1..
ID2    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes2..
ID3    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes3..
ID4    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes4..

我只需要第一列包含ID的信息和最后一列包含有关每个ID的注释。 我想要一个类似于此的字典:

{'ID1': [notes1...]
 'ID2': [notes2...]....
 'ID1234': [notes1234...]}

但是如果只有字典的列表或类似的东西,我也很满意。因此,我首先将文本转换成一个列表,以便我可以通过索引查找条目:
import csv

list_all = list(csv.reader(open(r'complex_tabbed_file.gff', 'rb'), delimiter='\t'))

d = dict()
ID = data[5][0]     #starting at 5 to skip the header lines
notes = data[5][8]
d[ID]= notes

print (d)

这给了我需要的信息,但一次只读取一个条目。我需要创建一个循环,来读取包含数百个条目的整个文件。有什么建议可以作为起点吗?
我调查了并找到了这个链接:Read specific columns from a csv file with csv module?,其中描述了类似的情况,但编码有些超出我的能力范围。由于我是新手,很难将这个例子应用到我的特定情况中。
下面是我尝试迭代的代码:
i=0

if i < 4:
    i= i+1

if i >= 5:
    ID = list_all[i][0]
    notes = list_all[i][8] 
    i= i+1

print (d)

这将返回一个空字典 ( d={ } ),不好。

还尝试过:

d = dict()  
i=5
for line in list_all: 
    ID = list_all[i][0]
    notes = list_all[i][8] 
    i = i+1

print (d)

这会导致非常可爱的“索引超出范围”错误消息。如果您有任何建议,我会非常感激,谢谢!

3个回答

2
有时候完全跳过csv模块会更容易:
from pprint import pprint
d = dict()
with open('complex_tabbed_file.gff') as input_file:
  for line in input_file:
    line = line.split('\t')
    if len(line) > 1:
      d[line[0]] = [line[-1].strip()]

pprint(d)

2
您可以迭代每一行并丢弃只有一个字段(标题)的行来解决此问题:
import csv
import sys

d = dict()

with open(sys.argv[1], newline='') as csvfile:
    csvreader = csv.reader(csvfile, delimiter='\t')
    for row in csvreader:
        if len(row) == 1: continue
        _d = {row[0]: [row[-1]]}
        d.update(_d)

print(d)

运行方法如下:

python3 script.py infile

这将产生:

{
    'ID4': ['Notes4..'], 
    'ID1': ['Notes1..'], 
    'ID2': ['Notes2..'], 
    'ID3': ['Notes3..']
}

2

阅读您的代码让我想知道您是否阅读了文档?第一个小例子循环遍历所有条目/行...:http://docs.python.org/2/library/csv.html

无论如何,查看一下 csv 模块没有过滤注释的方法,但是可以使用Python自带的 filter

import csv
d = dict()
f = file('data.csv')
data = csv.reader(filter(lambda row: row[0]!='#', f), delimiter='\t')
for row in data:
  #print row
  d.update({row[0]: row[1:]})
f.close()
print(d)

您可以考虑使用DictReader而不是reader...

这样做可以使代码更加易于阅读和理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接