2015-08-03 2 views
-2

Я пытаюсь проанализировать файл CSV и извлечь несколько столбцов из CSV.Чтение определенных столбцов из CSV Python

ID | Code | Phase |FBB | AM | Development status | AN REMARKS | stem | year | IN -NAME |IN Year |Company                          
L2106538 |Rs124 | 4 | | | Unknown | | -pre- | 1982 | Domoedne | 1982 | XYZ 

Я хотел бы группировать и извлекать несколько столбцов для их загрузки в разные модели.

Например, я хотел бы сгруппировать первые 3 столбца модели, следующие две в другую модель, первый столбец и 6, 7 в другую модель и так далее.

Мне также нужно сохранить заголовок файла и сохранить данные как пару ключевых значений, чтобы я знал, какой столбец должен идти для определенного поля в модели.

Это то, что у меня есть до сих пор.

def group_header_value(file): 
    reader = csv.DictReader(open(file, 'r'))# to have the header and get the data as a key value pair. 
    all_result= [] 
    for row in reader: 
     print row 
     all_result.append(row) 
    return all_result 


def group_by_models(all_results): 
    MD = range(1,3) # to get the required cols. 
    for every_row in all_results: 
     contents = [(every_row[i] for i in MD)] 
     print contents 

def handle(self, *args, **options): 
     database = options.get('database') 
     filename = options.get('filename') 
     all_results = group_header_value(filename) 
     print 'grouped_bymodel', group_by_models(all_results) 

Это то, что я получаю, когда я пытаюсь получить содержимое grouped_by модель: в 0x7f9f5382e0f0> в 0x7f9f5382e0a0> в 0x7f9f5382e0f0>

Есть другой подход для извлечения определенных столбцов в DictReader? как еще я могу извлечь необходимые столбцы, используя DictReader. Спасибо

+0

Могу ли я узнать причину за понижение голосов? – user3752511

ответ

1

(every_row[i] for i in MD) является generator expression. Синтаксис выражения генератора (в основном) совпадает с синтаксисом для list comprehension, за исключением того, что выражение генератора заключено в круглые скобки, (...), тогда как в представлении списка используются скобки, [...].

[(every_row[i] for i in MD)] - это список, содержащий один элемент, выражение генератора.

Чтобы исправить код с минимальными изменениями, удалите скобки:

def group_by_models(all_results): 
    MD = range(1,3) # to get the required cols. 
    for every_row in all_results: 
     contents = [every_row[i] for i in MD] 
     print(contents) 

Вы также могли бы сделать group_by_models более многоразовые, делая MD параметр:

def group_by_models(all_results, MD=range(3)): 
    for every_row in all_results: 
     contents = [every_row[i] for i in MD] 
     print(contents) 
+0

Извините @unutbu, но это не работает. Я получаю keyerror: 1 – user3752511

+0

Привет, Если есть лучший способ для этого, чем использование DictReader, я могу изменить свой код соответствующим образом. Я новичок в Python, и любая помощь будет очень оценена. – user3752511

+0

Это произойдет, если '1' не является ключом в dict,' every_row'. Помните, что если вы используете 'DictReader', то каждая строка является dict, ключи которой являются именами полей, указанными в заголовке. Если первые три имени поля: «ID», «Код», «Фаза», вы можете называть «group_by_models» (all_results, MD = ['ID', 'Code', 'Phase']). В качестве альтернативы используйте 'csv.reader' вместо' csv.DictReader'. Затем строки будут списками, а затем вы можете использовать 'group_by_models (all_results, MD = range (3))' для доступа к первым трем полям. – unutbu

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