Python 将csv文件行透视到列中并保存到文件中
我在一个文件夹中有多个CSV文件。我必须读取columnheader和每个文件的前2行,并将csv文件中的输出以行格式写入列中 示例-文件名:Test1.csvPython 将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
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,它工作得非常好。谢谢。