2016-09-25 198 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