Python 将csv文件行透视到列中并保存到文件中

Python 将csv文件行透视到列中并保存到文件中,python,csv,pivot,Python,Csv,Pivot,我在一个文件夹中有多个CSV文件。我必须读取columnheader和每个文件的前2行,并将csv文件中的输出以行格式写入列中 示例-文件名:Test1.csv ID产品名称 1 ABC 2 AA 3毫升 10问 11秒 文件名:Test2.csv 代码描述 AAAA B BBBB C中交 DDDD 所需的输出文件格式-Outputfile.csv FileName列第1行第2行 Test1.csv Id 1 2 Test1.csv产品名称ABC AA Test2.csv代码A B Test

我在一个文件夹中有多个CSV文件。我必须读取columnheader和每个文件的前2行,并将csv文件中的输出以行格式写入列中

示例-文件名:Test1.csv

ID产品名称
1 ABC
2 AA
3毫升
10问
11秒
文件名:Test2.csv

代码描述
AAAA
B BBBB
C中交
DDDD
所需的输出文件格式-Outputfile.csv

FileName列第1行第2行
Test1.csv Id 1 2
Test1.csv产品名称ABC AA
Test2.csv代码A B
Test2.csv说明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;文件名;修饰酸;文件大小;定界符;柱
c:\My Folder\Test1.csv;Test1.csv;2017 01 09;45;,;身份证件1.2.
c:\My Folder\Test1.csv;Test1.csv;2017 01 09;45;,;产品名称;ABC;AA
c:\My Folder\Test2.csv;Test2.csv;2017 01 09;48;,;代码;A.B
c:\My Folder\Test2.csv;Test2.csv;2017 01 09;48;,;描述AAAA;BBBB

Python的
csv
模块用于将Python列表自动转换为csv行。它为您添加了所有必要的分隔符。如果任何条目包含分隔符,它也会自动在其周围添加引号。

以下方法应该有效。它使用
作为输出分隔符,并使用
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;文件名;修饰酸;文件大小;定界符;柱
c:\My Folder\Test1.csv;Test1.csv;2017 01 09;45;,;身份证件1.2.
c:\My Folder\Test1.csv;Test1.csv;2017 01 09;45;,;产品名称;ABC;AA
c:\My Folder\Test2.csv;Test2.csv;2017 01 09;48;,;代码;A.B
c:\My Folder\Test2.csv;Test2.csv;2017 01 09;48;,;描述AAAA;BBBB

Python的
csv
模块用于将Python列表自动转换为csv行。它为您添加了所有必要的分隔符。如果任何条目包含分隔符,它也会自动在其周围添加引号。

您对代码有什么结果?您对代码有什么结果?嗨,Martin,非常感谢您的帮助。也许我遗漏了一些东西,但我得到了错误:IndexError:list索引超出了第二行的范围。如果我只读取了一行,那么它就可以正常工作。它当前假定所有输入文件都包含两列,如果不是这样,请给出一个例子。您能否确认CSV格式,即逗号、制表符、空格?您好,Martin,每个文件中的列数不同。i、 e.第一个文件可以有列Id、名称、位置。第二个文件可以有代码和说明。它的逗号是分开的。现在试试吧,我已经修改了它,使它可以处理不同数量的列。非常感谢Martin,它工作得非常好。非常感谢。嗨,马丁,非常感谢你的帮助。也许我遗漏了一些东西,但我得到了错误:IndexError:list索引超出了第二行的范围。如果我只读取了一行,那么它就可以正常工作。它当前假定所有输入文件都包含两列,如果不是这样,请给出一个例子。您能否确认CSV格式,即逗号、制表符、空格?您好,Martin,每个文件中的列数不同。i、 e.第一个文件可以有列Id、名称、位置。第二个文件可以有代码和说明。它的逗号是分开的。现在试试吧,我已经修改了它,使它可以处理不同数量的列。非常感谢Martin,它工作得非常好。谢谢。