2013-07-23 2 views
1

У меня есть CSV-файлы, в которых данные отформатирован следующим образом:Объединение нескольких файлов CSV в один

file1.csv

ID,NAME 
001,Jhon 
002,Doe 

fille2.csv

ID,SCHOOLS_ATTENDED 
001,my Nice School 
002,His lovely school 

file3.csv

ID,SALARY 
001,25 
002,40 

ID Поле является видом первичного ключа, который будет использоваться для получения записи.

Каков наиболее эффективный способ чтения от 3 до 4 файлов и получения соответствующих данных и хранения в другом файле CSV с заголовками (ID, NAME, SCHOOLS_ATTENDED, SALARY)?

Размеры файлов указаны в сотнях мегабайт (100, 200 Мб).

+0

Почему кто-то будет его понижать ??? – Volatil3

+0

Возможно, потому что это показывает отсутствие исследовательских усилий с вашей стороны? Это был не я. –

+0

Я думаю, что это дублированный вопрос. Вы всегда должны искать его, прежде чем открывать новый вопрос. BTW, это был не я! Http: //stackoverflow.com/questions/17586573/python-combing-data-from-different-csv-files-into-one/17588521#17588521 –

ответ

3

Сотни мегабайт не так уж много. Почему бы не пойти для простого подхода с использованием csv module и collections.defaultdict:

import csv 
from collections import defaultdict 

result = defaultdict(dict) 
fieldnames = {"ID"} 

for csvfile in ("file1.csv", "file2.csv", "file3.csv"): 
    with open(csvfile, newline="") as infile: 
     reader = csv.DictReader(infile) 
     for row in reader: 
      id = row.pop("ID") 
      for key in row: 
       fieldnames.add(key) # wasteful, but I don't care enough 
       result[id][key] = row[key] 

В результате defaultdict выглядит следующим образом:

>>> result 
defaultdict(<type 'dict'>, 
{'001': {'SALARY': '25', 'SCHOOLS_ATTENDED': 'my Nice School', 'NAME': 'Jhon'}, 
'002': {'SALARY': '40', 'SCHOOLS_ATTENDED': 'His lovely school', 'NAME': 'Doe'}}) 

Затем можно объединить, что в файл CSV (не моя хорошенькую работу, но достаточно хорошо сейчас):

with open("out.csv", "w", newline="") as outfile: 
    writer = csv.DictWriter(outfile, sorted(fieldnames)) 
    writer.writeheader() 
    for item in result: 
     result[item]["ID"] = item 
     writer.writerow(result[item]) 

out.csv затем содержит

ID,NAME,SALARY,SCHOOLS_ATTENDED 
001,Jhon,25,my Nice School 
002,Doe,40,His lovely school 
+0

Спасибо, но ваш код дает ошибку ** csv.Error: iterator должен возвращать строки, а не байты (вы открыли файл в текстовом режиме?) *** – Volatil3

+1

@ Volatil3: Я только что заметил, что вы на Python 3; Я уже отредактировал программу. Пожалуйста, попробуйте еще раз. –

+0

Я только заметил, что разделитель ** ** ** – Volatil3

0

Ниже приведен рабочий код для объединения нескольких файлов csv с определенными ключевыми словами в их именах в 1 окончательный файл csv. Я установил ключевое слово по умолчанию для «файла», но u может установить его пустым, если вы хотите объединить все файлы csv из папки_папки. Этот код получит заголовок из вашего первого файла csv и будет использовать его в качестве заголовка в конечном объединенном файле csv. Он будет игнорировать заголовки всех других CSV-файлов.

import glob,os 
@staticmethod 
def Combine_multiple_csv_files_thatContainsKeywordInTheirNames_into_one_csv_file(folder_path,keyword='file'): 
    #takes header only from 1st csv, all other csv headers are skipped and data is appened to final csv 

    fileNames = glob.glob(folder_path + "*" + keyword + "*"+".csv") # fileNames INCLUDES FOLDER_PATH TOO 
    with open(folder_path+"Combined_csv.csv", "w", newline='') as fout: 
     print('Combining multiple csv files into 1') 
     csv_write_file = csv.writer(fout, delimiter=',') 
     # a.writerows(op) 
     with open(fileNames[0], mode='rt') as read_file: # utf8 
      csv_read_file = csv.reader(read_file, delimiter=',') # CSVREADER READS FILE AS 1 LIST PER ROW. SO WHEN WRITIN TO ANOTHER CSV FILE WITH FUNCTION WRITEROWS, IT INTRODUCES ANOTHER NEW LINE '\N' CHARACTER. SO TO AVOID DOUBLE NEWLINES , WE SET NEWLINE AS '' WHEN WE OPEN CSV WRITER OBJECT 
      csv_write_file.writerows(csv_read_file) 

     for num in range(1, len(fileNames)): 
      with open(fileNames[num], mode='rt') as read_file: # utf8 
       csv_read_file = csv.reader(read_file, delimiter=',') # CSVREADER READS FILE AS 1 LIST PER ROW. SO WHEN WRITIN TO ANOTHER CSV FILE WITH FUNCTION WRITEROWS, IT INTRODUCES ANOTHER NEW LINE '\N' CHARACTER. SO TO AVOID DOUBLE NEWLINES , WE SET NEWLINE AS '' WHEN WE OPEN CSV WRITER OBJECT 
       next(csv_read_file) # ignore header 
       csv_write_file.writerows(csv_read_file) 
Смежные вопросы