csv文件列读取和使用python

问题描述:

我有以下代码...csv文件列读取和使用python

reader=csv.DictReader(open("test1.csv","r")) 
allrows = list(reader) 

keepcols = [c for c in allrows[0] if all(r[c] != '0' for r in allrows)] 

print keepcols 
writer=csv.DictWriter(open("output1.csv","w"),fieldnames='keepcols',extrasaction='ignore') 
writer.writerows(allrows) 

我有大约有45的cols一个CSV文件中提取..
第一列有一些名字..
除了第一列,所有其他人只有0和1的... ,当然,整个表也有一些标题以及..
即时通讯设法从csv文件中读取列,我需要提取只有那些列1
问题是输出文件是空的,即使有表中的几个列1的..

可能有人请帮助我.... :(IM卡得要命..

Title 3003_contact 3003_backbone 3003_sidechain 3003_polar 3003_hydrophobic 3003_acceptor 3003_donor 3003_aromatic 
l1 1 1 0 1 1 0 0 0 
l1 1 0 1 0 0 0 1 0 
l1 1 0 0 0 0 0 0 0 
l1 1 0 0 0 1 0 0 1 
l1 1 0 0 0 0 0 0 0 
l2 1 0 0 0 1 0 0 0 
l2 1 0 0 0 0 1 0 0 
l3 1 0 0 0 0 0 0 0 
l3 1 0 0 0 0 0 1 0 
l3 1 0 0 0 0 0 0 1 
l3 1 0 0 0 0 0 0 0 
l3 1 0 0 0 0 0 0 0 
l4 1 0 0 0 0 0 0 0 
l4 1 0 0 0 0 0 0 0 
l4 1 0 0 0 0 0 0 0 

它只返回列1 ...我VE试图改变“keepcols”来keepcols ......我得到COLUMN2先COLUMN1作为输出

编辑:如果输入的文件是一个逗号分隔值文件,然后 维持键的顺序,请使用reader.fieldnames代替allrows[0]中的密钥。

因此,解决办法是:

keepcols = [c for c in reader.fieldnames if any(r[c] != '0' for r in allrows)] 

上面贴的输入文件看起来有空格分隔的列。在这种情况下,我不认为csv是解析它的正确工具。相反,你可以使用split

import csv 
with open("test1.csv","r") as f: 
    fields=next(f).split() 
    # print(fields) 
    allrows=[] 
    for line in f: 
     line=line.split() 
     row=dict(zip(fields,line)) 
     allrows.append(row) 
     # print(row) 
    keepcols = [c for c in fields if any(row[c] != '0' for row in allrows)] 
    print keepcols 
    writer=csv.DictWriter(open("output1.csv","w"),fieldnames=keepcols,extrasaction='ignore') 
    writer.writerows(allrows) 

EDIT2:为什么列顺序发生了变化,因为for c in allrows[0]返回未指定顺序的allrows[0]键的原因。 dict键默认情况下不会被排序。上面的代码通过将fields定义为列表来解决这个问题,而不是dict

原来的答复: 更改fieldnames='keepcols'fieldnames=keepcols

fieldnames需要是一个键序列,如['fieldA','fieldB',...]

在Python中需要注意的一个潜在缺陷是字符串是序列。当你迭代一个字符串时,你会得到字符串的字符。所以当你说fieldnames='keepcols'时,你将fieldnames设置为字符序列['k','e','e','p','c','o','l','s']。您不会收到错误,因为这是一个有效的密钥序列。但是你的清单allrows并不会碰到这些键。 writer.writerows由于extrasaction='ignore'而愉快地忽略了这个。

+0

试图改变...我先获得column2然后column1只作为输出...重新上阵不会出现...但我需要提取一个列,即使它有一个单独的1 ...请帮助。 ... – beginner 2010-07-11 11:48:11

+0

所以我应该怎么处理它.. ??我真的失去了......( – beginner 2010-07-11 11:51:45

+0

)把'all'改成'any'。顺便说一下,你想这个从原来的不是很清楚问题 – bernie 2010-07-11 11:54:04