为了清楚起见,我对编程非常陌生,而且我正在使用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)
它给出了如此可爱的“列表索引超出范围”错误消息。我真的很感激任何建议,谢谢!
答案 0 :(得分: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..']
}
答案 1 :(得分: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
......
答案 2 :(得分: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)