2013-11-10 5 views
0

Каков наилучший и самый элегантный способ получить содержимое файла csv в виде списков? Обратите внимание, что требуемые столбцы, такие как Страна, Область и Население, должны быть идентифицированы автоматически, как в приведенной ниже программе.извлекает содержимое файла csv в виде списков

with open ('data.csv','r') as infile: 
    contents = infile.read().split(',') 

with open ('data.csv','r') as infile: 
    countries = [item.split(',')[contents.index('Country')] for item in infile] 

with open ('data.csv','r') as infile: 
    areas = [item.split(',')[contents.index('Area')] for item in infile] 

with open ('data.csv','r') as infile: 
    populations = [item.split(',')[contents.index('Population')] for item in infile] 

print (countries) 
print (areas) 
print (populations) 

Выше программы работает, но ищет довольно короткую и читаемую программу.

Update: Чтобы предотвратить ошибку, когда некоторые колонки, такие как «страна» не существует в каком-то файле, программа может быть улучшена:

countries = [item.split(',')[contents.index('Country')] for item in infile if 'Country' in contents] 

Как это можно сделать с помощью модуля Csv ??

+0

Вы попробовали [csv module] (http://docs.python.org/2/library/csv.html)? – zero323

ответ

3

Используйте csv module для CSV файлов:

import csv 

countries = [] 
areas = [] 
populations = [] 

with open ('data.csv', newline='') as infile: 
    reader = csv.DictReader(infile) 
    for row in reader: 
     countries.append(row['Country']) 
     areas.append(row['Area']) 
     populations.append(row['Population']) 

где DictReader() класс автоматически использует первую строку заголовков в качестве ключей для остальной части файла.

Или используйте:

import csv 

with open ('data.csv', newline='') as infile: 
    reader = csv.reader(infile) 
    next(reader, None) # skip the header first 
    countries, areas, populations = zip(*reader) 

, если все, что вам есть 3 колонки, страна, область и население, в этом порядке.

+0

спасибо. Я предпочел первый метод с DictReader, потому что столбцы не известны. Тем не менее, как я могу избежать ключевой ошибки, когда указанный заголовок столбца, такой как «Область», не существует в некоторых файлах во время пакетной обработки? @Martijn Pieters – 2964502

+1

Тест для ключа: 'if 'Area' в строке:' и т. Д. –

Смежные вопросы