Python | Объедините несколько файлов csv (100+) из одной папки с учетом заголовка csv

Требование: у меня есть папка с несколькими CSV-файлами. Мне нужно выполнить следующее:

  1. Просканируйте входную папку для всех файлов csv (file1.csv, file2.csv ..... filen.csv и т. д.) И выполните следующие шаги.
  2. Откройте первый файл csv (file1.csv) и сохраните заголовок файла в списке, а затем скопируйте все содержимое (включая заголовок) файла file1.csv и поместите в комбинированный.csv => Затем переместите file1.csv в папку / done в родительской папке
  3. Перейти к следующему файлу file2.csv => Сравните заголовок file2.csv с заголовком первого файла, чтобы убедиться, что они точно совпадают. Если заголовки совпадают, скопируйте содержимое (исключая заголовок) файла file2.csv и поместите в комбинированный.csv => Затем переместите file2.csv в папку / done в родительской папке. Если заголовок file2.csv не совпадает, исключите объединение этого файла, оставьте его в той же родительской папке и перейдите к следующему файлу для объединения

Я разместил образцы файлов по ссылке папка gdrive с примерами файлов CSV Я открыт для любого решения, будь то CSV или pandas, если оно делает то, что я хочу

В качестве отправной точки я сначала работал над сравнением заголовка, который работает, как показано ниже. Однако я не уверен, как двигаться дальше.

Код:

    import csv        
    def compare_two_csv_headers(csv_file1, csv_file2):
        with open(csv_file1, newline='') as f:
            reader = csv.reader(f)
            frow1 = next(reader)  # gets the first line
            print(frow1)
        with open(csv_file2, newline='') as f:
            reader = csv.reader(f)
            frow2 = next(reader)  # gets the first line
            print(frow2)
        if frow1==frow2:
            print('Same header')
        else:
            print('Different header')

    csv_file1 = 'D:/2009/cm01JAN2009bhav.csv'
    csv_file2 = 'D:/2009/cm01DEC2009bhav.csv'
    compare_two_csv_headers(csv_file1, csv_file2)

Вот 10 первых строк из первого CSV-файла.

SYMBOL,SERIES,OPEN,HIGH,LOW,CLOSE,LAST,PREVCLOSE,TOTTRDQTY,TOTTRDVAL,TIMESTAMP,
20MICRONS,EQ,46.5,47,45.7,46.05,46,46.55,7092,328975.25,31-DEC-2009,
3IINFOTECH,EQ,85.8,86.7,84.5,85.15,85.35,85.05,2423812,207760480.3,31-DEC-2009,
3MINDIA,EQ,1855.05,1879.9,1855.05,1865.75,1874.95,1850.45,85,158679.1,31-DEC-2009,
AARTIDRUGS,EQ,107.4,108.75,103.65,104.45,104.9,106.05,84012,8929759.4,31-DEC-2009,
AARTIIND,EQ,51,51.9,48.9,49.2,49.1,50.45,149365,7517110.3,31-DEC-2009,
AARVEEDEN,EQ,64,64.5,63.05,63.85,63.1,62.7,2172,138651.5,31-DEC-2009,
ABAN,EQ,1265,1297,1265,1283.65,1283.2,1260.05,1381290,1773221519.75,31-DEC-2009,
ABB,EQ,756.2,770.85,756.2,767.1,769.55,756.3,292376,223660807.4,31-DEC-2009,
ABCIL,EQ,85.4,89,84.9,86.85,86.95,84.7,59183,5170993.2,31-DEC-2009,
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
639
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрите возможность использования методов pandas для итеративной проверки столбцов и запуска импорта вместо сканирования первых строк с помощью csv. Кроме того, используйте os для управления извлечением имен файлов и местоположениями с помощью shutil для перемещения файлов Выполнено. Ниже построен список фреймов данных для окончательной конкатенации вне цикла.

import os, shutil
import pandas as pd

def import_csvs(csv_file):

    path = r'/path/to/csv/files'
    csv_files = sorted([f for f in os.listdir(path) if f[-3:] == 'csv'])

    # INITIALIZE DATAFRAME LIST
    df_list = []
    # READ FIRST DF (ASSUMED FIRST IN ALPHABETICAL ORDER)
    first_df = pd.read_csv(os.path.join(path, csv_files[0]))
    # APPEND FIRST DF   
    df_list.append(first_df)

    # MOVE FIRST CSV
    shutil.move(os.path.join(path, csv_files[0]), os.path.join(path,'done',csv_files[0]))

    # LOOP ALL OTHER CSVs SKIPPING FIRST
    for f in csv_files[1:]:                 
       # IMPORT CSV
       tmp = pd.read_csv(os.path.join(path, f))

       # CHECK DF COLUMNS EXACTLY MATCH
       if list(tmp.columns) == list(first_df.columns):  
          # APPEND DF TO LIST
          df_list.append(tmp)

          # MOVE COMPLETED FILE
          shutil.move(os.path.join(path, f), os.path.join(path, 'done', f))

    final_df = pd.concat(df_list)

    return final_df

Работал в точности как требование. После экспорта final_df в out.csv я вижу заголовок последнего столбца, в котором написано Безымянный: 11. Вот символы в файле: SYMBOL SERIES OPEN HIGH LOW CLOSE LAST PREVCLOSE TOTTRDQTY T‌ OTTRDVAL TIMESTAMP U‌ n named: 11

Pal S 02.05.2018 04:02

Проверьте свои данные. У вас есть безымянный столбец 11 в первом CSV-файле?

Parfait 02.05.2018 04:17

Я не вижу в данных ни одного безымянного столбца. Я загрузил окончательный файл out.csv в виде zip-файла в папку grdive на случай, если вы захотите взглянуть на него drive.google.com/open?id=1_1jgRS2IrnHJ_ogHYyVuRzgEnmpuQave

Pal S 02.05.2018 05:21

Кажется безымянным: 11 - это номер заголовка, который есть в файлах. Я открыл все 237 файлов вручную и убедился, что других файлов нет. Я также запустил код с меньшим количеством файлов 1) с 1 файлом и 2) с 4 файлами. Каждый раз в out.csv было безымянное: 11 даже со случайными файлами.

Pal S 02.05.2018 05:28

Я использую следующее для экспорта out.csv <<<< --- final_df.to_csv (dir_path + 'out.csv', encoding = 'utf-8', index = False) --- >>>>

Pal S 02.05.2018 05:31

Пожалуйста, откройте первый или любой CSV-файл в текстовом редакторе (Блокнот, TextEdit, gedit и т. д.) И проверьте, есть ли в последнем столбце пробелы: data,data,, или data,data,"",. Если да, проверьте, как изначально создавались файлы CSV. Они отображаются как фантомные столбцы в Excel, Lotus или LibreOffice, которые нельзя увидеть без содержимого. Посмотрите, где CTRL (CMD в MacOS) + END переводит курсор в конец содержимого.

Parfait 02.05.2018 18:25

Пытался, но ничего не нашел. Открыл несколько CSV-файлов в Notepad ++ и выполнил поиск следующего: ,, или, <пробел>, или, "", или, "<пробел>",. CSV загружаются с внешнего веб-сайта и автоматически создаются сервером. Я не контролирую создание CSV. Кроме того, независимо от образца CSV-файла (у меня почти 2000+) безымянный: 11 остается прежним. Все файлы имеют 11 столбцов. Итак, я предполагаю, что безымянный: 11 не связан с какими-то ложными скрытыми данными, а скорее имеет какое-то отношение к тому, как Pandas видит заголовки 11 Column?

Pal S 03.05.2018 05:12

Можете ли вы опубликовать первые десять строк первый csv в теле сообщения из Notepad ++? Затем вы можете отформатировать контент с помощью форматирования кода, {}. Я не могу получить доступ к ссылкам GDrive отсюда.

Parfait 03.05.2018 15:59

Добавлены 10 лучших строк первого csv в свой пост

Pal S 06.05.2018 04:17

В конце у вас есть пустые столбцы, поскольку каждая строка разрывается на запятую. Добавьте строку для первого csv и в цикле, чтобы удалить его. Ses pandas's drop.

Parfait 06.05.2018 06:41

Другие вопросы по теме