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

2024-10-01 07:17:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想说清楚,我对编程非常陌生,我使用的是Python3.3!现在我有很多文件在相同的基本布局。每个文件有9列,用制表符分隔,页眉行数可变,但大多数都有5行。或者没有列的标题!在

看起来像这样:

#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的注释

^{pr2}$

但我也很乐意看到一个字典列表之类的。在

因此,我首先将文本转换为列表列表,以便按索引查找条目:

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)

这会给出“列表索引超出范围”的错误消息。如果有任何建议,我将不胜感激,谢谢!在


Tags: 文件csvid列表alllistnotesprint
3条回答

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

读你的代码确实让我怀疑你是否读过文档?第一个小示例循环遍历所有条目/行…: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。。。在

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

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)

运行方式如下:

^{pr2}$

结果是:

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

相关问题 更多 >