Объединить несколько CSV-файлов с разными столбцами в python ошибка с Writerow - PullRequest
1 голос
/ 12 февраля 2020

У меня есть большое количество CSV-файлов / фреймов данных, которые слишком велики, чтобы хранить их вместе в памяти. Тем не менее, я заметил, что размер столбцов в данных фреймах различен. Мои столбцы - перестановки "ACGT" (последовательности ДНК). Я следовал инструкциям этого вопроса о том, как написать несколько CSV-файлов с разными столбцами, однако я получаю следующую ошибку: AttributeError: у объекта 'str' нет атрибута 'keys'. Я нашел этот вопрос для устранения ошибки, однако я не уверен, где редактировать код, чтобы сделать объект 'line' словарем. Я также обеспокоен тем, что мои csv-файлы, имеющие столбец индекса без значения заголовка, могут испортить мой код, или может возникнуть проблема с форматом моих имен полей (str, полученных из перестановок). Если есть способ объединить несколько CSV-файлов с разными на другом языке, я исправлю это, однако у меня возникли проблемы с и этим вопросом .

import glob
import csv
import os

mydir = "test_csv/"

file_list = glob.glob(mydir + "/*.csv") # Include slash or it will search in the wrong directory!!
file_list

import itertools
fieldnames = []
for p in itertools.product('ACGT', repeat=8):
    fieldnames.append("".join(p))


for filename in file_list:
    with open(filename, "r", newline="") as f_in:
        reader = csv.reader(f_in)
        headers = next(reader)
with open("Outcombined.csv", "w", newline="") as f_out:
    writer = csv.DictWriter(f_out, fieldnames=fieldnames)
    for filename in file_list:
        with open(filename, "r", newline="") as f_in:
            reader = csv.DictReader(f_in)
            for line in headers:
                writer.writerow(line)

1 Ответ

1 голос
/ 12 февраля 2020

Вам нужно только один раз написать заголовок, так что делайте это перед вашим file_list l oop:

with open('Outcombined.csv','w',newline='') as f_out: 
    writer = csv.DictWriter(f_out,fieldnames=fieldnames) 
    writer.writeheader() # write header based on `fieldnames`
    for filename in file_list: 
        with open(filename,'r',newline='') as f_in: 
        reader = csv.DictReader(f_in) 
        for line in reader: 
            writer.writerow(line) 

. DictWriter позаботится о размещении значений под правильными заголовками.

...