Ребята, у меня есть 200 отдельных файлов csv, названных из SH (1) в SH (200). Я хочу объединить их в один файл csv. Как мне это сделать?Как слить 200 файлов csv в Python
ответ
Как ghostdog74 сказал, но на этот раз с заголовками:
fout=open("out.csv","a")
# first file:
for line in open("sh1.csv"):
fout.write(line)
# now the rest:
for num in range(2,201):
f = open("sh"+str(num)+".csv")
f.next() # skip the header
for line in f:
fout.write(line)
f.close() # not really needed
fout.close()
спасибо за это решение! именно то, что я искал! – Riccardo
вы можете использовать 'f .__ next __()' вместо 'f.next()' в python3.x. –
Если объединенное CSV будет использоваться в Python затем просто использовать glob
, чтобы получить список файлов для передачи fileinput.input()
через files
аргумента, а затем использовать csv
модуль, чтобы прочитать все это на одном дыхании.
fout=open("out.csv","a")
for num in range(1,201):
for line in open("sh"+str(num)+".csv"):
fout.write(line)
fout.close()
Это зависит от того, что вы подразумеваете под «слиянием» - есть ли у них одинаковые столбцы? У них есть заголовки? Например, если все они имеют одинаковые столбцы и заголовки, достаточно простой конкатенации (откройте файл назначения для записи, зациклитесь на источниках, открывающих каждый для чтения, используйте shutil.copyfileobj из источника для чтения для чтения, для записи адресата, закройте источник, продолжайте цикл - используйте оператор with
, чтобы сделать закрытие от вашего имени). Если они имеют одинаковые столбцы, но также и заголовки, вам понадобится readline
для каждого исходного файла, кроме первого, после того, как вы откроете его для чтения, прежде чем копировать его в пункт назначения, чтобы пропустить строку заголовков.
Если у CSV-файлов не все одинаковые столбцы, вам необходимо определить, в каком смысле вы их «слияете» (например, SQL JOIN? Или «по горизонтали», если все они имеют одинаковое количество строк ? и т. д.) - нам трудно угадать, что вы имеете в виду в этом случае.
Каждый файл имеет два столбца с заголовками. Я хочу объединить их в один файл с двумя столбцами последовательно. – Chuck
Вы можете импортировать csv, затем пропустить все файлы CSV, считывая их в список. Затем напишите список на диск.
import csv
rows = []
for f in (file1, file2, ...):
reader = csv.reader(open("f", "rb"))
for row in reader:
rows.append(row)
writer = csv.writer(open("some.csv", "wb"))
writer.writerows("\n".join(rows))
Вышеупомянутое не очень надежное, так как оно не имеет обработки ошибок и не закрывает открытые файлы. Это должно работать независимо от того, имеют ли отдельные файлы одну или несколько строк данных CSV в них. Также я не запускал этот код, но он должен дать вам представление о том, что делать.
Почему ты не можешь просто sed 1d sh*.csv > merged.csv
?
Иногда вам даже не нужно использовать python!
В окнах C: \> copy * .csv merged.csv –
Скопируйте информацию заголовка из одного файла: sed -n 1p some_file.csv> merged_file.csv Скопируйте все, кроме последней строки из всех других файлов: sed 1d * .csv >> merged_file.csv – behas
@blinsay Он также добавляет заголовок в каждый файл CSV в объединенный файл. – Mina
Я просто хочу через другой пример кода в корзине
from glob import glob
with open('singleDataFile.csv', 'a') as singleFile:
for csvFile in glob('*.csv'):
for line in open(csvFile, 'r'):
singleFile.write(line)
@ Andy Я не вижу разницы между stackoverflow, напоминающим мне, чтобы проголосовать за ответ, и я напоминаю людям поделиться своей оценкой (путем голосования вверх), если они найдут мой ответ полезным. Я знаю, что это не Facebook, и я не похож на охотника. – Norfeldt
Было [обсуждено] (http://meta.stackexchange.com/a/63440/186281) [ранее] (http: // meta.stackexchange.com/a/194063/186281), и каждый раз [считается] (http://meta.stackexchange.com/questions/167155/comments-asking-for-upvotes-accepts) неприемлемым. – Andy
см. @adders исправленный код ниже – mattrweaver
Небольшое изменение к выше, как это на самом деле не работает правильно кода.
Он должен быть следующим ...
from glob import glob
with open('main.csv', 'a') as singleFile:
for csv in glob('*.csv'):
if csv == 'main.csv':
pass
else:
for line in open(csv, 'r'):
singleFile.write(line)
Довольно легко объединить все файлы в каталоге и объединить их
import glob
import csv
# Open result file
with open('output.txt','wb') as fout:
wout = csv.writer(fout,delimiter=',')
interesting_files = glob.glob("*.csv")
h = True
for filename in interesting_files:
print 'Processing',filename
# Open and process file
with open(filename,'rb') as fin:
if h:
h = False
else:
fin.next()#skip header
for line in csv.reader(fin,delimiter=','):
wout.writerow(line)
Используйте accepted StackOverflow answer, чтобы создать список файлов CSV, который вы хотите добавить, а затем запустить этот код:
import pandas as pd
combined_csv = pd.concat([ pd.read_csv(f) for f in filenames ])
И если вы хотите экспортировать его в один файл csv, используйте это:
combined_csv.to_csv("combined_csv.csv", index=False)
@ wisty, @ Энди, предположим, что у всех файлов есть заголовки для каждой строки - несколько строк с разными заголовками. Нет заголовков для 2 столбцов в каждом файле. Как можно объединить, так что для каждого файла добавляется только столбец. – Gathide
Где экспортируется файл? – dirtysocks45
@ dirtysocks45, я изменил ответ, чтобы сделать это более явным. – scottlittle
Я изменил то, что @wisty сказал укладываться питона 3.x, для тех из вас, что есть проблема кодирования, я также использовать модуль ОС, чтобы избежать от жесткого кодирования
import os
def merge_all():
dir = os.chdir('C:\python\data\\')
fout = open("merged_files.csv", "ab")
# first file:
for line in open("file_1.csv",'rb'):
fout.write(line)
# now the rest:
list = os.listdir(dir)
number_files = len(list)
for num in range(2, number_files):
f = open("file_" + str(num) + ".csv", 'rb')
f.__next__() # skip the header
for line in f:
fout.write(line)
f.close() # not really needed
fout.close()
Вот скрипт:
- Конкатенация CSV файлы с именем
SH1.csv
вSH200.csv
- Сохранение заголовков
import glob
import re
# Looking for filenames like 'SH1.csv' ... 'SH200.csv'
pattern = re.compile("^SH([1-9]|[1-9][0-9]|1[0-9][0-9]|200).csv$")
file_parts = [name for name in glob.glob('*.csv') if pattern.match(name)]
with open("file_merged.csv","wb") as file_merged:
for (i, name) in enumerate(file_parts):
with open(name, "rb") as file_part:
if i != 0:
next(file_part) # skip headers if not first file
file_merged.write(file_part.read())
- 1. слить несколько файлов CSV perl
- 2. Слить несколько csv с помощью python
- 3. Как слить несколько файлов excel
- 4. Как слить похожие файлы csv с открытием?
- 5. Как слить несколько файлов?
- 6. Как слить файлы .csv при определенных условиях?
- 7. Как слить несколько наборов текстовых файлов
- 8. Как слить несколько файлов CSV из разных подпапок?
- 9. python чтение csv файлов
- 10. Слить несколько кликов * .bil в * .csv
- 11. Слить два файла CSV
- 12. Изменение CSV-файлов в python
- 13. Загрузка CSV файлов в Python
- 14. Манипулирование файлов CSV в Python
- 15. слияния файлов CSV в Python
- 16. Как слить два .csv-файла в javascript?
- 17. Как слить два файла csv в php?
- 18. Как написать несколько файлов csv в python
- 19. Как слить два файла в python
- 20. Как слить несколько файлов excel?
- 21. Как слить несколько файлов патчей?
- 22. Как слить список в python
- 23. Слияние файлов CSV в Python с разными именами файлов
- 24. импорт * .csv и слить листы
- 25. Как слить много файлов VRT в один
- 26. Как слить несколько массивов в python?
- 27. Слить файл csv с заголовком
- 28. Перебор столбцов в CSV-файлов в Python
- 29. Добавление строк в CSV-файлов в Python
- 30. Как слить два итератора python?
Каким способом вы слейте их? (Конкатенатные строки, ...) – tur1ng
Как вы хотите, чтобы они слились? Каждая строка в файле CSV представляет собой строку. Таким образом, один простой вариант - просто объединить все файлы вместе. –
Каждый файл имеет два столбца. Я хочу объединить их в один файл с двумя столбцами последовательно. – Chuck