将 csv 文件的行转换为列并保存在文件中

pivot csv file rows into columns and save in file

我在一个文件夹中有多个 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

以下方法应该有效。它使用 ; 作为输出分隔符并使用 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 行。它为您添加了所有必要的分隔符。如果任何条目包含分隔符,它还会自动在其周围添加引号。