2013-11-13 2 views
0

Предположим, у меня есть два CSV-файла, называемых A и B в Python.Добавление двух CSV-файлов по столбцам

A 's head выглядит следующим образом:

headerNameA1,headerNameA2 
1.12412424,1 
1,1 
1,1 
1,1 

B' s head выглядит следующим образом:

headerNameB1,headerNameB2 
1,1 
1,1 
1,1 
1,1 

Моя цель состоит в том, чтобы принять B и добавить его на A так, что A будет выглядеть :

headerNameA1,headerNameA2,headerNameB1,headerNameB2 
1,1,1.12412424,1 
1,1,1,1 
1,1,1,1 
1,1,1,1 

С другой вопрос, я спросил, вот код, который будет принимать A и B и объединить их в C:

import csv 
with open('A','rb') as f1, open('B','rb') as f2, open('out.csv','wb') as w: 
    writer = csv.writer(w) 
    r1,r2 = csv.reader(f1),csv.reader(f2) 
    while True: 
     try: 
      writer.writerow(next(r1)+next(r2)) 
     except StopIteration: 
      break 

Однако цель этого вопроса просто добавить B на задней A.

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

Баш решение под названием через os.system приемлемо

+1

Насколько велики эти файлы CSV, что их объединенный размер является проблемой? Кроме того, код, который у вас есть, является странным способом написания 'для r1, r2 в izip (f1, f2):' - что с этим происходит? –

+0

@JonClements В любом месте от 1 до 10 гигабайт, вычислений, выполняемых на удаленном сервере. Это был ответ от другого вопроса; функции прекрасны, поэтому я просто оставлю это. – user2763361

+0

@JonClements По-видимому, мне нужно использовать 'ab' вместо' wb', но я не могу найти руководство где-нибудь – user2763361

ответ

0

Если вы получаете два файла ручки для одного файла - один в режиме «чтения», один в режиме «обновления» (r+b), та же стратегия должна Работа.

from itertools import izip 
import csv 
with open('A','rb') as f1, open('B','rb') as f2, open('A','r+b') as w: 
    writer = csv.writer(w) 
    for r1,r2 in izip(csv.reader(f1),csv.reader(f2)): 
     writer.writerow(r1+r2) 

Если возможно, я рекомендовал бы против такого рода вещей и просто явно записывать в третий файл.

+0

Почему вы рекомендуете писать в третий файл? Это невозможно, если у вас 10 гигабайт, и мне нужно добавить к нему много маленьких файлов. Я не хочу создавать копии 10 гигабайт для каждого небольшого файла, который я хочу добавить в конец. – user2763361

+0

Это решение просто удаляет первый файл вместо добавления к нему. – user2763361

+0

Я протестировал это только сейчас, как в поле Ubuntu, так и в окне окна, отлично работает. Что касается того, почему лучше писать в третий файл: ну, просто ответили, не так ли? Если что-то пойдет не так, ваш первый файл - это тост без возможности вернуть его. Дисковое пространство дешево, вы можете очистить временные файлы, когда закончите. – roippi

1

Возможно, вам удастся с именованным трубой. У вас запущен процесс Python, который создает канал и открывает его в режиме записи. Затем он выводит на то, что мутированная конкатенация CSV-файлов в столбце (аналогично тому, что у вас есть) уже ... Когда другой процесс начинает читать этот файл, он сможет потреблять данные, но файл фактически не сохраняется на сервере это просто по требованию. Когда «файл» потребляется, в нем ничего не будет, и любая попытка доступа к нему блокируется до тех пор, пока другой процесс не запишет на другой конец.

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

import os 
from itertools import izip 

a = 'abcdef' # File A's rows 
b = 'ghijkl' # File B's rows 

outname = 'joined' 

try: 
    os.unlink(outname) 
    os.mkfifo(outname) 
except OSError: 
    pass 

with open(outname, 'w') as fout: 
    for items in izip(a, b): 
     fout.write(''.join(items) + '\n') # Do "real" write here instead... 
    os.unlink(outname) 

Что-то еще, что открывает «файл» в режиме чтения и потребляет его для извлечения данных. Это должно работать, если этот процесс не должен иметь «физические файлы» ...

+0

Считаете ли вы, что это будет медленнее, чем создание нескольких копий 'A' с последующим удалением старого' A'? – user2763361

+1

Это в компромиссе ... Что вы упомянули, будет связано с пространством и чтением/записью на дисковые затраты, чтобы создать новый A. Хотя это позволяет хранить затраты на хранение довольно постоянными, имеет примерно одинаковые требования к чтению, но торгует один раз диск записывает, для вычислительных затрат (которые являются небольшими) на доступ .... –

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