Как два слить несколько файлов .csv по горизонтали с питоном? - PullRequest
3 голосов
/ 21 октября 2010

У меня есть несколько файлов .csv (~ 10), и мне нужно объединить их в один файл по горизонтали.Каждый файл имеет одинаковое количество строк (~ 300) и 4 строки заголовка, которые не обязательно идентичны, но не должны объединяться (брать только строки заголовка из первого файла .csv).Токены в строках разделены запятыми без пробелов между ними.

Как нуб-питон, я не нашел решения, хотя уверен, что есть простое решение этой проблемы.Любая помощь приветствуется.

Ответы [ 6 ]

6 голосов
/ 21 октября 2010

Вы можете загрузить файлы CSV, используя модуль csv в Python. Пожалуйста, обратитесь к документации этого модуля для загрузки кода, я не могу вспомнить, но это действительно легко. Что-то вроде:

import csv
reader = csv.reader(open("some.csv", "rb"))
csvContent = list(reader)

После этого, когда у вас есть файлы CSV, загруженные в такой форме (список кортежей):

[ ("header1", "header2", "header3", "header4"),
  ("value01", "value12", "value13", "value14"),
  ("value11", "value12", "value13", "value14"),
  ... 
]

Вы можете объединить два таких списка построчно:

result = [a+b for (a,b) in zip(csvList1, csvList2)]

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

writer = csv.writer(open("some.csv", "wb"))
writer.writerows(result)
2 голосов
/ 21 октября 2010

Модуль csv - ваш друг.

1 голос
/ 21 октября 2010

Вам не нужно использовать модуль CSV для этого.Вы можете просто использовать

file1 = open(file1)

После открытия всех ваших файлов вы можете сделать это

from itertools import izip_longest

foo=[]
for new_line in izip_longest(file1,fil2,file3....,fillvalue=''):
    foo.append(new_line)

Это даст вам такую ​​структуру (о которой вам уже говорил кон).работать, если у вас разное количество строк в каждом файле

[ ("line10", "line20", "line30", "line40"),
  ("line11", "line21", "line31", "line41"),
  ... 
]

После этого вы можете просто записать его в новый файл, принимая по 1 списку за раз

for listx in foo:
    new_file.write(','.join(j for j in listx))

PS: подробнее оizip_longest здесь

1 голос
/ 21 октября 2010

Если вам не обязательно использовать Python, вы можете использовать такие инструменты оболочки, как paste/gawk и т. Д.

$ paste file1 file2 file3 file4 .. | awk 'NR>4'

Выше расположите их горизонтально без заголовков. Если вы хотите заголовки, просто получите их от file1

$  ( head -4 file ; paste file[1-4] | awk 'NR>4' ) > output
0 голосов
/ 21 октября 2010

Чисто для учебных целей

Простой подход, который не использует преимущества модуля csv:

# open file to write
file_to_write = open(filename, 'w')
# your list of csv files
csv_files = [file1, file2, ...] 

headers = True
# iterate through your list
for filex in csv_files:
    # mark the lines that are header lines
    header_count = 0
    # open the csv file and read line by line
    filex_f = open(filex, 'r')
    for line in filex_f:
        # write header only once
        if headers:
            file_to_write.write(line+"\n")
            if header_count > 3: headers = False
        # Write all other lines to the file
        if header_count > 3:
            file_to_write.write(line+"\n")
        # count lines
        header_count = header_count + 1
    # close file
    filex_f.close()
file_to_write.close()
0 голосов
/ 21 октября 2010

Вы учитесь, делая (и пытаясь, даже).Итак, я просто дам вам несколько советов.Используйте следующие функции:

  • Чтобы открыть файл: open()
  • Чтобы прочитать все строки в файле: IOBase.readlines()
  • Чтобы разбить строку в соответствии с серией токенов: str.split()

Если вы действительно незнаете, что делать, я рекомендую вам прочитать учебник и Dive Into Python 3 .(В зависимости от того, сколько Python вы знаете, вам придется либо прочитать первые несколько глав, либо перейти непосредственно к главам файлового ввода-вывода.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...