объединить все файлы в каталог с python [duplicate]

Лучше суммирования треугольников суммирует трапеции в декартовом пространстве:

area = 0;
for (i = 0; i < n; i++) {
  i1 = (i + 1) % n;
  area += (vertex[i].y + vertex[i1].y) * (vertex[i1].x - vertex[i].x) / 2.0;
}
49
задан Chuck 25 March 2010 в 01:24
поделиться

14 ответов

Как сказал 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()
55
ответ дан wisty 19 August 2018 в 12:30
поделиться

Небольшое изменение в коде выше, поскольку оно действительно не работает правильно.

Он должен быть следующим:

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)
3
ответ дан Adders 19 August 2018 в 12:30
поделиться

Это зависит от того, что вы подразумеваете под «слиянием» - есть ли у них одинаковые столбцы? У них есть заголовки? Например, если все они имеют одинаковые столбцы и заголовки, достаточно простой конкатенации (откройте файл назначения для записи, зациклитесь на источниках, открывающих каждый для чтения, используйте shutil.copyfileobj из открытого - для чтения в открытое место для записи, закройте источник, продолжайте цикл - используйте оператор with, чтобы сделать закрытие от вашего имени). Если они имеют одинаковые столбцы, но также заголовки, вам понадобится readline для каждого исходного файла, кроме первого, после того, как вы откроете его для чтения, прежде чем копировать его в место назначения, чтобы пропустить строку заголовков.

Если файлы CSV не все имеют одинаковые столбцы, вам нужно определить, в каком смысле вы их «слияете» (например, SQL JOIN? или «по горизонтали», если все они имеют одинаковое количество строк ? и т. д. и т. д.) - нам трудно угадать, что вы имеете в виду в этом случае.

10
ответ дан Alex Martelli 19 August 2018 в 12:30
поделиться
  • 1
    Каждый файл имеет два столбца с заголовками. Я хочу объединить их в один файл с двумя столбцами последовательно. – Chuck 25 March 2010 в 15:25

Я просто проведу другой пример кода в корзине

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)
10
ответ дан Andy 19 August 2018 в 12:30
поделиться
  • 1
    @Andy Я не вижу разницы между stackoverflow, напоминающим мне, чтобы проголосовать за ответ, и я напомнил людям поделиться своей оценкой (путем голосования), если они найдут мой ответ полезным. Я знаю, что это не Facebook, и я не похож на охотника. – Norfeldt 1 May 2014 в 11:20
  • 2
    Ранее обсуждался ранее , и каждый раз, когда он считался неприемлемым. – Andy♦ 1 May 2014 в 14:02
  • 3
    см. приведенный ниже код @adders – mattrweaver 3 December 2015 в 13:47

Почему вы не можете просто sed 1d sh*.csv > merged.csv?

Иногда вам даже не нужно использовать python!

31
ответ дан blinsay 19 August 2018 в 12:30
поделиться
  • 1
    В окнах C: \ & gt; копировать * .csv merged.csv – Andy Terra 17 June 2011 в 14:30
  • 2
    Скопируйте информацию заголовка из одного файла: sed -n 1p some_file.csv & gt; merged_file.csv Скопируйте все, кроме последней строки из всех других файлов: sed 1d * .csv & gt; & gt; merged_file.csv – behas 11 October 2011 в 18:39
  • 3
    @blinsay Он также добавляет заголовок в каждый файл CSV в объединенный файл. – Mina 2 May 2014 в 02:51
  • 4
    Как вы используете эту команду без копирования информации заголовка для каждого последующего файла после первого? Кажется, я снова получаю информацию о заголовке. – Joe 27 August 2014 в 05:57
  • 5
    Это здорово, если вам не нужно удалять заголовок! – Blairg23 4 January 2016 в 23:28

Вы можете импортировать 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 в них. Также я не запускал этот код, но он должен дать вам представление о том, что делать.

1
ответ дан cnobile 19 August 2018 в 12:30
поделиться
fout=open("out.csv","a")
for num in range(1,201):
    for line in open("sh"+str(num)+".csv"):
         fout.write(line)    
fout.close()
13
ответ дан ghostdog74 19 August 2018 в 12:30
поделиться

Достаточно просто объединить все файлы в каталог и слить их

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)
1
ответ дан gogocatmario 19 August 2018 в 12:30
поделиться

Если объединенный CSV будет использоваться в Python, то просто используйте glob , чтобы получить список файлов, которые будут переданы в fileinput.input() с помощью кнопки files, затем используйте модуль csv , чтобы прочитать все за один раз.

3
ответ дан Ignacio Vazquez-Abrams 19 August 2018 в 12:30
поделиться

Обновление ответа wisty для python3

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")
    next(f) # skip the header
    for line in f:
         fout.write(line)
    f.close() # not really needed
fout.close()
0
ответ дан ishandutta2007 19 August 2018 в 12:30
поделиться

Я изменил то, что @wisty сказал, что он работает с python 3.x, для тех из вас, у кого есть проблема с кодировкой, также я использую модуль os, чтобы избежать жесткого кодирования

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()
0
ответ дан Maryam Pashmi 19 August 2018 в 12:30
поделиться

Используйте принятый ответ StackOverflow , чтобы создать список файлов 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 )
17
ответ дан scottlittle 19 August 2018 в 12:30
поделиться
  • 1
    @ wisty, @ Энди, предположим, что у всех файлов есть заголовки для каждой строки - несколько строк с разными заголовками. Нет заголовков для 2 столбцов в каждом файле. Как можно объединить, так что для каждого файла добавляется только столбец. – Gathide 6 January 2017 в 12:14
  • 2
    Где экспортируется файл? – dirtysocks45 5 December 2017 в 18:52
  • 3
    @ dirtysocks45, я изменил ответ, чтобы сделать это более явным. – scottlittle 6 December 2017 в 18:51

Если вы работаете с linux / mac, вы можете это сделать.

from subprocess import call
script="cat *.csv>merge.csv"
call(script,shell=True)
0
ответ дан sunny 19 August 2018 в 12:30
поделиться

Вот сценарий:

  • Объединение 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())
0
ответ дан x0s 19 August 2018 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: