我有以下代码......
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)
我有一个csv文件,大约有45个字符串。
第一列有一些名字..
除了第一列,所有其他只有0和1 ...
当然,整个表格也有一些标题。
我试图从csv文件中读取列,我只需要提取那些带有1的字符串
问题是输出文件是空的,即使表中有几列有1的..
有人可以请你帮帮我.... :(我被困住了......
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列...我尝试将'keepcols'更改为keepcols ...然后我先获取column2然后将column1作为输出
答案 0 :(得分:4)
编辑:如果输入文件是逗号分隔值文件,则
要维护密钥的顺序,请使用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'
轻率地忽略了这一点。