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

用于在Python中解析复杂的制表符分隔/csv文件的循环,python,parsing,csv,dictionary,Python,Parsing,Csv,Dictionary,说清楚一点,我对编程非常陌生,我正在使用Python 3.3!现在我有很多文件在相同的基本布局。每个文件有9列,以制表符分隔,标题行数可变,但大多数文件有五行。行或列没有标题 看起来像这样: #header1 #header2 #header3 #header4 #header5 ID1 asdf asdk asdfk asdfkl adsfkln askdlfn safsda asdf Notes1.. ID2 asdf asdk

说清楚一点,我对编程非常陌生,我正在使用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)
这给了我我正在寻找的信息,但一次只读取一个条目。我需要创建一个循环来读取包含数百个条目的整个文件。关于起点的建议

我研究发现:

这描述了一个类似的情况,但编码有点让我摸不着头脑。作为一个新手,我很难将这个例子应用到我的特定案例中=(

以下是我在迭代方面所做的尝试:

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)

这会显示非常可爱的“列表索引超出范围”错误消息。我非常感谢您的建议,谢谢!

您可以通过迭代每行来解决此问题,并丢弃只有一个字段(标题)的字段:

像这样运行:

python3 script.py infile
这将产生:

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

阅读您的代码确实让我想知道您是否阅读了文档?第一个小示例在所有条目/行上循环…:

无论如何,查看csv模块无法过滤掉注释,但是您可以使用python自己的
过滤器

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

有时完全跳过
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)
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)
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)