繁体   English   中英

使用python读取和提取csv文件列

[英]csv file column reading and extracting using 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)

我有一个csv文件,有大约45个cols ..
第一列有一些名字..
除了第一列,所有其他人只有0和1 ...当然,整个表也有一些标题..
我试图从csv文件中读取列,我只需要提取那些1的cols
问题是输出文件是空的,即使表中有几列有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作为输出

编辑:如果输入文件是逗号分隔值文件,那么为了维护键的顺序,使用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列表, allrows没有碰巧有这些键。 自从extrasaction='ignore'以来, extrasaction='ignore' writer.writerows地忽略了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM