2017-01-09 3 views
0

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

Example: 
FileName: Test1.csv 
ID ProductName 
1 ABC 
2 AA 
3 CC 
10 Q 
11 s 

FileName: Test2.csv 
Code Description 
A AAAA 
B BBBB 
C CCCC 
D DDDD 

Required Outfile format: 
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 
+0

Какой результат у вас есть с кодом? –

ответ

0

следующий подход должен работать. Он использует ; в качестве выходного разделителя и использует 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 

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

+0

Привет, Мартин, Большое спасибо за вашу помощь. Возможно, я что-то пропустил, но получаю ошибку: IndexError: индекс индекса вне диапазона для второй строки. Если я читаю только 1 строку, тогда она работает нормально. –

+0

В настоящее время предполагается, что все ваши входные файлы содержат два столбца, если это не так, вы можете привести пример. Можете ли вы также точно подтвердить формат CSV, т. Е. Это запятые, вкладки, пробелы? –

+0

Привет, Мартин, количество столбцов в каждом файле различно. то есть первый файл может иметь столбцы Id, Name, Location. Второй файл может иметь код и описание. Его запятые разделены. –