Объединение 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.