Объединение CSV файлов с одним столбцом в один файл CSV с 14 столбцами

В настоящее время у меня есть 14 файлов CSV, каждый из которых содержит один столбец данных за день (14, потому что он возвращается 2 недели)

Я хочу сделать один CSV файл, содержащий данные из всех 14 этих CSV файлов

например. если каждый CSV содержит следующее:

1
2
3
4

Я хотел бы, чтобы результат был csv файлом с

1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,

(фактические CSV имеют 288 строк)

В настоящее время я использую код, который я нашел в другом вопросе, он отлично работал для 2 или 3 CSV, но когда я добавил больше, он не делал этого больше, чем первые 3, и теперь код выглядит крайне беспорядочным.

Извинения за большой кусок кода, но это то, что у меня есть до сих пор.

def csvappend(): with open('C:\dev\OTQtxt\\result1.csv', 'rb') as csv1: with open('C:\dev\OTQtxt\\result2.csv', 'rb') as csv2: with open('C:\dev\OTQtxt\\result3.csv', 'rb') as csv3: with open('C:\dev\OTQtxt\\result4.csv', 'rb') as csv4: with open('C:\dev\OTQtxt\\result5.csv', 'rb') as csv5: with open('C:\dev\OTQtxt\\result6.csv', 'rb') as csv6: with open('C:\dev\OTQtxt\\result7.csv', 'rb') as csv7: with open('C:\dev\OTQtxt\\result8.csv', 'rb') as csv8: with open('C:\dev\OTQtxt\\result9.csv', 'rb') as csv9: with open('C:\dev\OTQtxt\\result10.csv', 'rb') as csv10: with open('C:\dev\OTQtxt\\result11.csv', 'rb') as csv11: with open('C:\dev\OTQtxt\\result12.csv', 'rb') as csv12: with open('C:\dev\OTQtxt\\result13.csv', 'rb') as csv13: with open('C:\dev\OTQtxt\\result14.csv', 'rb') as csv14: reader1 = csv.reader(csv1, delimiter=',') reader2 = csv.reader(csv2, delimiter=',') reader3 = csv.reader(csv3, delimiter=',') reader4 = csv.reader(csv4, delimiter=',') reader5 = csv.reader(csv5, delimiter=',') reader6 = csv.reader(csv6, delimiter=',') reader7 = csv.reader(csv7, delimiter=',') reader8 = csv.reader(csv8, delimiter=',') reader9 = csv.reader(csv9, delimiter=',') reader10 = csv.reader(csv10, delimiter=',') reader11 = csv.reader(csv11, delimiter=',') reader12 = csv.reader(csv12, delimiter=',') reader13 = csv.reader(csv13, delimiter=',') reader14 = csv.reader(csv14, delimiter=',') all = [] for row1, row2, row3, row4, row5, row6, row7, row8, row9, \ row10, row11, row12, row13, row14 in zip(reader1, \ reader2, reader3,\ reader4, reader5, \ reader7, reader8,\ reader9, reader10, \ reader11, reader12,\ reader13,reader14): row14.append(row1[0]) row14.append(row2[0]) row14.append(row3[0]) row14.append(row4[0]) row14.append(row5[0]) row14.append(row6[0]) row14.append(row7[0]) row14.append(row8[0]) row14.append(row9[0]) row14.append(row10[0]) row14.append(row11[0]) row14.append(row12[0]) row14.append(row13[0]) all.append(row14) with open('C:\dev\OTQtxt\TODAY.csv', 'wb') as output: writer = csv.writer(output, delimiter=',') writer.writerows(all)

Я думаю, что некоторые из моих отступов были испорчены при копировании, но вы должны получить эту идею. И я не ожидаю, что прочитаю все это, это очень повторяемо.

Я видел несколько похожих/связанных вопросов, рекомендующих инструменты unix. В случае, если кто-то собирается предположить, что я лучше скажу вам, что это будет работать в окнах.

Если у кого-нибудь есть идеи о том, как я могу это очистить и заставить его работать. Я был бы очень благодарен!

3 ответа

Создание файлов:

xxxx@xxxx:/tmp/files$ for i in {1..15}; do echo -e "1\n2\n3\n4" > "my_csv_$i.csv"; done
xxxx@xxxx:/tmp/files$ more my_csv_1.csv
1
2
3
4
xxxx@xxxx:/tmp/files$ ls
my_csv_10.csv my_csv_11.csv my_csv_12.csv my_csv_13.csv my_csv_14.csv my_csv_15.csv my_csv_1.csv my_csv_2.csv my_csv_3.csv my_csv_4.csv my_csv_5.csv my_csv_6.csv my_csv_7.csv my_csv_8.csv my_csv_9.csv

Использование itertools.izip_longest:

with open('result.csv', 'w') as f_obj: rows = [] files = os.listdir('.') for f in files: rows.append(open(f).readlines()) iter = izip_longest(*rows) for row in iter: f_obj.write(','.join([field.strip() for field in row if field is not None])+'\n')

Вывод:

xxxxx@xxxx:/tmp/files$ more result.csv
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2
3,3,3,3,3,3,3,3,3,3,3,3,3,3,3
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4

Это не лучшее решение, так как вы поместите все свои данные в память. Но вы должны понять, как это сделать. Кстати, если все ваши данные являются числовыми, я буду оставаться с numpy и играть с многомерными массивами.


Вы можете использовать это, имена файлов также могут быть указаны в цикле:

import numpy as np
filenames = ['file1', 'file2', 'file3'] # all the files to be read in
data = [] # saves data from the files
for filename in filenames: data.append(open(filename, 'r').readlines()) # append a list of all numbers in the current file
data = np.matrix(data).T # transpose the list of list using numpy
data_string = '\n'.join([','.join([k.strip() for k in j]) for j in data.tolist()]) # create a string by separating inner elements by ',' and outer list by '\n'
with open('newfile', 'w') as fp: fp.write(data_string)


Только что протестировали:

import csv
import glob
files = glob.glob1("C:\\dev\\OTQtxt", "*csv")
rows=[]
with open('C:\\dev\\OTQtxt\\one.csv', 'a') as oneFile: for file in files: rows.append(open("C:\\dev\\OTQtxt\\" + file, 'r').read().splitlines()) for row in rows: writer = csv.writer(oneFile) writer.writerow(''.join(row))

Это приведет к файлу one.csv в вашем каталоге csv, который будет содержать все файлы merdged * csv

licensed under cc by-sa 3.0 with attribution.