2013-11-30 1 views
0

Мне нужно объединить два CSV-файлы, A.csv и B.csv, с одной осью в общем, экстракт:Python - слияние файлов CSV с одной осью в общий

9.358,3.0 
9.388,2.0 

и

8.551,2.0 
8.638,2.0 

I хотите, чтобы окончательный файл C.csv имел следующий шаблон:

8.551,0.0,2.0 
8.638,0.0,2.0 
9.358,3.0,0.0 
9.388,2.0,0.0 

Как вам предложить t сделать это? Должен ли я идти за циклом?

ответ

3

Просто читать из каждого файла, выписывая в выходной файл и добавить в колонке «пропущенного»:

import csv 

with open('c.csv', 'wb') as outcsv: 
    # Python 3: use open('c.csv', 'w', newline='') instead 
    writer = csv.writer(outcsv) 

    # copy a.csv across, adding a 3rd column 
    with open('a.csv', 'rb') as incsv: 
     # Python 3: use open('a.csv', newline='') instead 
     reader = csv.reader(incsv) 
     writer.writerows(row + [0.0] for row in reader) 

    # copy b.csv across, inserting a 2nd column 
    with open('b.csv', 'rb') as incsv: 
     # Python 3: use open('b.csv', newline='') instead 
     reader = csv.reader(incsv) 
     writer.writerows(row[:1] + [0.0] + row[1:] for row in reader) 

В writer.writerows() линии делают всю работу; выражение генератора контузируется над строками в каждом reader, либо добавляя столбец, либо вставляя столбец посередине.

Это работает с любым размером входных CSV, которые у вас есть, так как в памяти хранятся только некоторые буферы чтения и записи. Строки обрабатываются итеративно, без необходимости хранить все входные или выходные файлы в памяти.

+0

Спасибо за это! Все отлично работает с 'a.csv', но не с' b.csv': я получил только первую строку и нули, но не вторую строку ... –

+0

@albus_c: Моя первоначальная версия не использовала нарезку; вы используете мое последнее редактирование? –

+0

Да, я все еще пропускаю одну колонку данных при работе с 'b.csv' –

3
import numpy as np 

dat1 = np.genfromtxt('dat1.txt', delimiter=',') 
dat2 = np.genfromtxt('dat2.txt', delimiter=',') 

dat1 = np.insert(dat1, 2, 0, axis=1) 
dat2 = np.insert(dat2, 1, 0, axis=1) 

dat = np.vstack((dat1, dat2)) 

np.savetxt('dat.txt', dat, delimiter=',', fmt='%.3f') 
2

Вот простое решение с использованием словаря, который будет работать для любого количество файлов:

from __future__ import print_function 

def process(*filenames): 
    lines = {} 
    index = 0 
    for filename in filenames: 
     with open(filename,'rU') as f: 
      for line in f: 
       v1, v2 = line.rstrip('\n').split(',') 
       lines.setdefault(v1,{})[index] = v2 
     index += 1 
    for line in sorted(lines): 
     print(line, end=',') 
     for i in range(index): 
      print(lines[line].get(i,0.0), end=',' if i < index-1 else '\n') 

process('A.csv','B.csv') 

печатает

8.551,0.0,2.0 
8.638,0.0,2.0 
9.358,3.0,0.0 
9.388,2.0,0.0 
+0

Я получил ошибку 'print (line, end = ',') ^ SyntaxError: invalid syntax' –

+0

Отлично работает для меня ... вы используете Python 2 или 3? – uselpa

+0

Версия 2.7.5 на Mac –

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