Arhn - архитектура программирования

свести строки CSV-файла в столбцы и сохранить в файле

У меня есть несколько файлов CSV в папке. Мне нужно прочитать заголовок столбца и первые 2 строки каждого файла и записать вывод в CSV-файл в формате строк в столбцы.

Пример — имя файла: Test1.csv

ID   ProductName
1    ABC
2    AA
3    CC
10  Q
11  s

Имя файла: Test2.csv

Code Description
A    AAAA
B    BBBB
C    CCCC
D    DDDD

Требуемый формат выходного файла — Outputfile.csv

FileName    Column          Row1  Row2
Test1.csv   Id               1     2
Test1.csv   ProductName     ABC    AA
Test2.csv   Code             A     B
Test2.csv   Description     AAAA   BBBB

Код:

with open(full_file_path,'r') as f_input:
                try:
                    columninfo = f_input.readline()
                    row_1 = next(f_input)
                    row_2 = next(f_input)

                    filedata = columninfo +';'+ row_1 +';'+ row_2
                    output = file +';'+ moddate +';'+ str(file_size) +';'+ file_delim +';'+ filedata
                    outputfinal = full_file_path +';'+ output + '\n'

                    ofile.write(outputfinal)
                    f_input.close()
                except:
                    pass
09.01.2017

  • Какой результат вы получили с кодом? 09.01.2017

Ответы:


1

Следующий подход должен работать. Он использует ; в качестве выходного разделителя и использует csv.Sniffer для автоматического определения разделителя, используемого для каждого из исходных файлов:

from datetime import datetime
import itertools
import csv
import sys
import os


script, path, output = sys.argv

with open(output, 'wb') as f_output:
    csv_output = csv.writer(f_output, delimiter=';')
    csv_output.writerow(['FolderFilePath', 'FileName', 'ModifiedDate', 'FileSize', 'Delimiter', 'Columns'])

    for root, folders, files in os.walk(path):
        for file in files:
            full_file_path = os.path.join(root, file)
            file_size = os.path.getsize(full_file_path)
            mod_date = datetime.fromtimestamp(os.path.getmtime(full_file_path)).strftime('%Y %m %d')
            start_cols = [full_file_path, file, mod_date, file_size]

            with open(full_file_path, 'rb') as f_csv:
                try:
                    dialect = csv.Sniffer().sniff(f_csv.read(1024))
                    start_cols.append(dialect.delimiter)
                    f_csv.seek(0)
                    csv_input = csv.reader(f_csv, dialect)

                    for row in itertools.izip(*itertools.islice(csv_input, 3)):
                        csv_output.writerow(start_cols + list(row))
                except csv.Error:
                    csv_output.writerow(start_cols + ["Unknown delimiter"])

Это даст вам следующий выходной файл CSV:

FolderFilePath;FileName;ModifiedDate;FileSize;Delimiter;Columns
c:\My Folder\Test1.csv;Test1.csv;2017 01 09;45;,;ID;1;2
c:\My Folder\Test1.csv;Test1.csv;2017 01 09;45;,;ProductName;ABC;AA
c:\My Folder\Test2.csv;Test2.csv;2017 01 09;48;,;Code;A;B
c:\My Folder\Test2.csv;Test2.csv;2017 01 09;48;,;Description;AAAA;BBBB

Модуль Python csv используется для автоматического преобразования списка Python в строку CSV. Он добавляет все необходимые разделители для вас. Если какая-либо из записей содержит разделитель, он также автоматически добавляет кавычки вокруг него.

09.01.2017
  • Привет Мартин, Большое спасибо за вашу помощь. Возможно, я что-то пропустил, но получаю сообщение об ошибке: IndexError: индекс списка вне диапазона для 2-й строки. Если я читаю только 1 строку, то все работает нормально. 09.01.2017
  • В настоящее время предполагается, что все ваши входные файлы содержат два столбца, если это не так, не могли бы вы привести пример. Можете ли вы также точно подтвердить формат CSV, то есть это запятые, табуляции, пробелы? 09.01.2017
  • Привет, Мартин, количество столбцов в каждом файле разное. то есть первый файл может иметь столбцы Id, Name, Location. Второй файл может иметь код и описание. Его запятые разделены. 09.01.2017
  • Попробуйте сейчас, я изменил его для работы с переменным количеством столбцов. 09.01.2017
  • Большое спасибо, Мартин, все работает отлично. Большое спасибо. 09.01.2017
  • Привет, Мартин. Если я читаю несколько файлов (.csv, .txt и т. д.), то есть ли способ получить разделитель, используемый в каждом файле, и сохранить его в выходном файле вместе с другими деталями, как указано в вашем сценарии. 11.01.2017
  • Спасибо, Мартин, не могли бы вы взглянуть на этот опубликованный код: stackoverflow.com/questions/41587578/ 11.01.2017
  • csv.sniffer сделает это. В качестве альтернативы вы можете попробовать прочитать заголовок из каждого файла, используя список различных разделителей, и решить, какой из них дает вам больше всего записей. 11.01.2017
  • Привет, Мартин. Не могли бы вы просмотреть прикрепленный код - он не объединяет информацию о столбце с данными строки в одной строке. Большое спасибо за вашу помощь. 16.01.2017
  • Где прикрепленный код? Если у вас возникли проблемы со сценарием, возможно, вы могли бы опубликовать ссылку на CSV-файл, вызывающий проблему. Взгляните на 0bin, он позволяет загружать файлы и публиковать ссылки на них (не используйте функцию коротких ссылок правда - иногда не работает) 16.01.2017
  • Привет, Мартин, вот код - 0bin.net/paste/ 16.01.2017
  • Проблема в коде в последней части для данных строки 2 и строки 3 - данные строки 2 и строки 3 поступают в одну строку вместе с информацией о столбце и т. Д. Они поступают в следующей строке в выходном файле csv. На прошлой неделе я работал над этим кодом и использовал аналогичную логику, которая работала нормально; каким-то образом удалил этот файл, поэтому пытаюсь понять, что я делаю неправильно. 16.01.2017
  • Вы действительно должны использовать Python csv. Он берет список и автоматически добавляет необходимые разделители между каждой записью для вас. Без него вы должны самостоятельно разделить каждую из своих строк, используя разделитель при чтении. Без csv ваш код становится очень плохого качества. 17.01.2017
  • Привет, Мартин, но мне нужно читать все файлы, а не только csv, это сработает? Также этот код будет работать, даже если в файлах меньше 2 строк? 17.01.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..