Как объединить два файла в python

У меня есть два CSV-файла с разделителями табуляции (с заголовками), которые мне нужно объединить в python.

Кроме того, в объединенный файл я хочу добавить в конце столбец для идентификации файлов, потому что, хотя они имеют одинаковый формат, у них разные данные, которые мне нужно будет разделить позже. Итак, я хочу добавить столбец с именем «источник» в каждую строку вывода, которая равна 0 для файла1 и 1 для файла2.

Я зашел так далеко, что использовал модуль csv, но writerow добавляет дополнительный символ новой строки между каждой записываемой строкой, и этот код ничего не записывает из файла2. Что я здесь делаю неправильно? Кроме того, как добавить дополнительный столбец «источник» в объект line?

import os, csv

path1 = os.path.abspath("../data/file1.txt")
path2 = os.path.abspath("../data/file2.txt")
merged_path = os.path.abspath('../data/output.txt')

# merge the two files for further processing
merged_file = csv.writer(open(merged_path, 'a'), delimiter = '\t')

#file1
fg = csv.reader(open(path1, 'r'), delimiter = '\t')

for line in fg:
    if line[7] != '\N':
        merged_file.writerow(line) 

#file2
bg = csv.reader(open(path2, 'r'), delimiter = '\t')

for line in bg:
    if line[16] != '\N':
        merged_file.writerow(line) 

person sfactor    schedule 09.02.2012    source источник


Ответы (1)


Я предпочитаю использовать для этого dictWriter. Кроме того, ваш код не работает, потому что библиотека csv требует открытия файлов в режиме binary.

import os, csv

path1 = os.path.abspath("../data/file1.txt")
path2 = os.path.abspath("../data/file2.txt")
merged_path = os.path.abspath('../data/output.txt')

#file1
fg = csv.DictReader(open(path1, 'rb'), delimiter = '\t')

fieldnames = fg.fieldnames
fieldnames.append('source')
# merge the two files for further processing
merged_file = csv.DictWriter(open(merged_path, 'ab'), delimiter = '\t', fieldnames=fieldnames)
merged_file.writeheader()

for row in fg:
    row['source'] = os.path.basename(path1)
    merged_file.writerow(row)

#file2
bg = csv.DictReader(open(path2, 'rb'), delimiter = '\t')

for row in bg:
    row['source'] = os.path.basename(path1)
    merged_file.writerow(row)
person Spencer Rathbun    schedule 09.02.2012
comment
Спасибо ! работал как в шарме. Это был мой первый настоящий код на Python. Лучше начать читать о его нюансах. - person sfactor; 09.02.2012
comment
В документации по csv не указано, что ему нужен двоичный режим. Он использует его в примерах, но некоторые примечания об этом были бы неплохо. - person rplnt; 09.02.2012
comment
@rplnt см. здесь раздел If csvfile is a file object, it must be opened with the ‘b’ flag on platforms where that makes a difference. - person Spencer Rathbun; 09.02.2012
comment
Двоичный режим не имеет значения на платформах, отличных от Windows. - person Wooble; 09.02.2012
comment
@Wooble только потому, что ОС открывает файлы как двоичные. Библиотека по-прежнему нуждается в открытии в двоичном формате, но вам не нужно об этом думать, если вы не используете Windows. - person Spencer Rathbun; 09.02.2012
comment
Нет, это не так. Он открывает их как текстовые файлы, просто системы *nix используют разумные окончания строк вместо мерзости Microsoft. - person Wooble; 09.02.2012
comment
@SpencerRathbun Я пропустил это. Спасибо. - person rplnt; 09.02.2012