2010-03-25 3 views
37

Ребята, у меня есть 200 отдельных файлов csv, названных из SH (1) в SH (200). Я хочу объединить их в один файл csv. Как мне это сделать?Как слить 200 файлов csv в Python

+2

Каким способом вы слейте их? (Конкатенатные строки, ...) – tur1ng

+5

Как вы хотите, чтобы они слились? Каждая строка в файле CSV представляет собой строку. Таким образом, один простой вариант - просто объединить все файлы вместе. –

+0

Каждый файл имеет два столбца. Я хочу объединить их в один файл с двумя столбцами последовательно. – Chuck

ответ

48

Как 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() 
+0

спасибо за это решение! именно то, что я искал! – Riccardo

+0

вы можете использовать 'f .__ next __()' вместо 'f.next()' в python3.x. –

3

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

12
fout=open("out.csv","a") 
for num in range(1,201): 
    for line in open("sh"+str(num)+".csv"): 
     fout.write(line)  
fout.close() 
10

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

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

+0

Каждый файл имеет два столбца с заголовками. Я хочу объединить их в один файл с двумя столбцами последовательно. – Chuck

1

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

29

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

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

+9

В окнах C: \> copy * .csv merged.csv –

+1

Скопируйте информацию заголовка из одного файла: sed -n 1p some_file.csv> merged_file.csv Скопируйте все, кроме последней строки из всех других файлов: sed 1d * .csv >> merged_file.csv – behas

+1

@blinsay Он также добавляет заголовок в каждый файл CSV в объединенный файл. – Mina

10

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

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) 
+2

@ Andy Я не вижу разницы между stackoverflow, напоминающим мне, чтобы проголосовать за ответ, и я напоминаю людям поделиться своей оценкой (путем голосования вверх), если они найдут мой ответ полезным. Я знаю, что это не Facebook, и я не похож на охотника. – Norfeldt

+0

Было [обсуждено] (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

+1

см. @adders исправленный код ниже – mattrweaver

3

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

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

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) 
1

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

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) 
8

Используйте 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) 
+0

@ wisty, @ Энди, предположим, что у всех файлов есть заголовки для каждой строки - несколько строк с разными заголовками. Нет заголовков для 2 столбцов в каждом файле. Как можно объединить, так что для каждого файла добавляется только столбец. – Gathide

+0

Где экспортируется файл? – dirtysocks45

+0

@ dirtysocks45, я изменил ответ, чтобы сделать это более явным. – scottlittle

0

Я изменил то, что @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() 
0

Вот скрипт:

  • Конкатенация 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()) 
Смежные вопросы