2015-04-14 3 views
0

Использование Python 2.7 для открытия файла превратит его в словарь с номером 0 как ключ и строку 3 в качестве значений. Затем откройте файл b для соответствующего идентификационного номера в строке 0, чтобы добавить другие столбцы для соответствия. Затем конвертируйте обратно в список и объедините два CSV.CSV-файл с неожиданным двойным пространством Python

В конце добавить заголовки и сохранить как "output.csv."

И пример того, что я ожидал:

Файл: с

1234, 14/12/2,123.4, 
5618, 13/1/12,23.4, 
9143, 15/2/14,222.4, 

Файл б:

1234,abc,cda 
9143,nda, bad 
5618, ede, fpc 

(сон) Выход:

payment date, payment amount, other id, other other id, payment status, payment type 
14/12/2,123.4,1234,abc,cda, Received, Recurring 
13/1/12,23.4,9143,nda, bad, Received, Recurring 
15/2/14,222.4,5618, ede, fpc,Received, Recurring 

(фактическая):

ID, payment date, payment amount, other id, other other id, payment status, payment type 
1234, 14/12/2,123.4,1234,abc,cda, Received, Recurring 

5618, 13/1/12,23.4,9143,nda, bad, Received, Recurring 

9143, 15/2/14,222.4,5618, ede, fpc,Received, Recurring 

Код:

import csv 

#create a dict from first csv, with clearing solution id as key 
with open("DDS.csv", "rb") as f: 
    first = {rows[0]: rows[3:] for rows in list(csv.reader(f))} 

# compare second csv, append rank, add received recurring columns 
with open("report.csv", "rb") as f: 
    for row in csv.reader(f): 
     if row and row[0] in first: # row[0] = clearing solution id 
      first[row[0]].append(row[1]) # row[1] = rank 
      first[row[0]].append(row[2]) 
      first[row[0]].append('Received') 
      first[row[0]].append('Recurring') 


# convert dict back to list 
merged = [(k,) + tuple(v) for k, v in first.items()] 

# write list to output csv 
with open('output.csv', "w") as f: 
    writer = csv.DictWriter(f, fieldnames =['ID', 'Payment Date', 'Payment Amount', 'Other ID','other other ID', 'Payment Status', 'Payment Type']) 
    writer.writeheader() 
    csv.writer(f).writerows(merged) 

Бонусные баллы: Как удалить первый столбец из выходных данных CSV?

Благодаря

+0

Непосредственная проблема, которую вы видите с лишними пустыми строками, должна быть решена путем добавления аргумента 'lineterminator = '\ n'' к' csv.DictWriter() ', в Windows модуль csv использует определитель' r \ n' по умолчанию, см. похожие вопросы, например [здесь] (http://stackoverflow.com/q/19618856/1222578) – Marius

ответ

0

Вы можете избавиться от первого просто не добавить (k,) к вашему кортежу и удалить «ID» из ваших имен полей. Вам не нужно создавать еще один писатель, чтобы написать строки csv.writer(f).writerows(merged):

merged = [tuple(v) for k, v in first.items()] 
with open('output.csv', "w") as f: 
    writer = csv.DictWriter(f, fieldnames =['Payment Date', 'Payment Amount', 'Other ID','other other ID', 'Payment Status', 'Payment Type']) 
    writer.writeheader() 
    writer.writerows(merged) 
+0

Спасибо, что сработало :) –

-1

Я предлагаю использовать классическую манипуляцию питона строки вместо модуля CSV.

Например, с помощью rows.replace(' ','').split(,)[0] вместо rows[0] следует решить проблему с пространством.