2016-09-25 141 views
0

我想读取一个CSV文件,然后从每列中取出所有的值并放入一个单独的列表中。我不希望按行排列。由于CSV阅读器只允许循环一次文件,因此我使用seek()方法返回到开头并阅读下一列。除了使用Dict映射外,还有更好的方法来做到这一点吗?阅读CSV文件中的所有列?

infile = open(fpath, "r") 
reader = csv.reader(infile)  

NOUNS = [col[0] for col in reader] 
infile.seek(0) # <-- set the iterator to beginning of the input file 

VERBS = [col[1] for col in reader] 
infile.seek(0) 
ADJECTIVES = [col[2] for col in reader] 
infile.seek(0) 
SENTENCES = [col[3] for col in reader] 

回答

1

像这样的事情会做一个合格:

kinds = NOUNS, VERBS, ADJECTIVES, SENTENCES = [], [], [], [] 
with open(fpath, "r") as infile: 
    for cols in csv.reader(infile): 
     for i, kind in enumerate(kinds): 
      kind.append(cols[i]) 
1

你可以喂readerzip,并根据需要将其解压缩到变量。

import csv 

with open('input.csv') as f: 
    first, second, third, fourth = zip(*csv.reader(f)) 
    print('first: {}, second: {}, third: {}, fourth: {}'.format(
     first, second, third, fourth 
    )) 

有了以下输入:

1,2,3,4 
A,B,C,D 

这将产生输出:

first: ('1', 'A'), second: ('2', 'B'), third: ('3', 'C'), fourth: ('4', 'D') 
0

我不知道你为什么不想使用字典映射。这是我最后做

数据

col1,col2,col3 
val1,val2,val3 
val4,val5,val6 

代码

import csv 
d = dict() 
with open("abc.text") as csv_file: 
    reader = csv.DictReader(csv_file) 
    for row in reader: 
     for key, value in row.items(): 
      if d.get(key) is None: 
       d[key] = [value] 
      else: 
       d[key].append(value) 

print d 
{'col2': ['val2', 'val5'], 'col3': ['val3', 'val6'], 'col1': ['val1', 'val4']} 
+0

这假定第一行是标题。无论如何,你可以用一行代替'if/else':'d.setdefault(key,[])。append(value)'。 – martineau

+0

是的,我假设第一行为标题。感谢您告诉我关于'setdefaultkey'的更多信息 –

1

该作品假设你知道确切地说csv有多少列(并且没有标题行)。

NOUNS = [] 
VERBS = [] 
ADJECTIVES = [] 
SENTENCES = [] 
with open(fpath, "r") as infile: 
    reader = csv.reader(infile)  

    for row in reader: 
     NOUNS.append(row[0]) 
     VERBS.append(row[1]) 
     ADJECTIVES.append(row[2]) 
     SENTENCES.append(row[3]) 

如果你不知道该列标题,你将必须要聪明,读出的第一行,通过每一个新行做出列出你遇到的每一个栏,并循环并插入适当的清单。你可能需要做一个列表清单。

如果您不介意添加依赖项,请使用Pandas。使用DataFrame和方法read_csv()。使用列名访问每列,即

df = pandas.DataFrame.read_csv(fpath) 
print df['NOUN'] 
print df['VERBS'] 
+0

您可以使用'csv.Sniffer'类跳过标题,如[answer](http://stackoverflow.com/a/11350095/355230)所示。 – martineau