在Python中组合长度未知但宽度相同的CSV文件列
我有一个未知数量的输入csv文件,看起来或多或少像这样(设置宽度和长度) 输出如下所示在Python中组合长度未知但宽度相同的CSV文件列,python,csv,Python,Csv,我有一个未知数量的输入csv文件,看起来或多或少像这样(设置宽度和长度) 输出如下所示 Header1,Header3, ,Header1,Header3, ,... 1,3, ,1,3, ,... ... 目前,我可以将所有输入文件读入字符串,我知道如何读取每个文件的第一行并以所需格式打印,但我一直在研究如何循环到每个文件的下一行并打印数据。由于文件在一端时长度不同,我不知道如何处理它,并将其放在空白处作为占位符以保持格式。下面是我的代码 csvs=[] 保持=[] i=0#开始时i=-1
Header1,Header3, ,Header1,Header3, ,...
1,3, ,1,3, ,...
...
目前,我可以将所有输入文件读入字符串,我知道如何读取每个文件的第一行并以所需格式打印,但我一直在研究如何循环到每个文件的下一行并打印数据。由于文件在一端时长度不同,我不知道如何处理它,并将其放在空白处作为占位符以保持格式。下面是我的代码
csvs=[]
保持=[]
i=0#开始时i=-1,改善了吗
对于名称为的文件:
i=i+1
csvs.append([i])
hold.append([i])
#z=0
对于范围(i)中的z:
#将csv文件放入字符串
csvs[z]=csv.reader(打开(名称[z],'rb'),分隔符=',')
行=[]
#z=0
对于范围(i)中的z:
按住[z]=csvs[z]。下一步()
行=行+[保持[z][0],保持[z][3],'']
打印行
writefile.writerow(行)
名称是保存csv文件路径的字符串。另外,我对这一点还相当陌生,因此如果您看到我可以做得更好的地方,我会全神贯注。这不会给您在输出中显示的多余逗号,但这并不难添加,只要在每次附加数据时在数据中弹出一个额外的空白字段即可:
import csv
names=['test1.csv','test2.csv']
csvs = []
done = []
for name in names:
csvs.append(csv.reader(open(name, 'rb')))
done.append(False)
while not all(done):
data = []
for i, c in enumerate(csvs):
if not done[i]:
try:
row = c.next()
except StopIteration:
done[i] = True
if done[i]:
data.append('')
data.append('')
# data.append('') <-- here
else:
data.append(row[0])
data.append(row[3])
# data.append('') <-- and here for extra commas
if not all(done):
print ','.join(data)
导入csv
名称=['test1.csv','test2.csv']
csvs=[]
完成=[]
对于名称中的名称:
csvs.append(csv.reader(open(name,'rb')))
完成。追加(False)
虽然不是全部(完成):
数据=[]
对于枚举中的i,c(CSV):
如果没有完成[i]:
尝试:
行=c.下一行()
除停止迭代外:
完成,完成
如果完成[i]:
data.append(“”)
data.append(“”)
#data.append(“”)这不会提供您在输出中显示的多余逗号,但这并不难添加,只要在每次附加数据时在数据中弹出一个额外的空白字段即可:
import csv
names=['test1.csv','test2.csv']
csvs = []
done = []
for name in names:
csvs.append(csv.reader(open(name, 'rb')))
done.append(False)
while not all(done):
data = []
for i, c in enumerate(csvs):
if not done[i]:
try:
row = c.next()
except StopIteration:
done[i] = True
if done[i]:
data.append('')
data.append('')
# data.append('') <-- here
else:
data.append(row[0])
data.append(row[3])
# data.append('') <-- and here for extra commas
if not all(done):
print ','.join(data)
导入csv
名称=['test1.csv','test2.csv']
csvs=[]
完成=[]
对于名称中的名称:
csvs.append(csv.reader(open(name,'rb')))
完成。追加(False)
虽然不是全部(完成):
数据=[]
对于枚举中的i,c(CSV):
如果没有完成[i]:
尝试:
行=c.下一行()
除停止迭代外:
完成,完成
如果完成[i]:
data.append(“”)
data.append(“”)
#data.append(“”)假设您知道在某些文件比其他文件长时如何合并行。下面是一种使行和文件上的迭代更容易的方法
from itertools import izip_longest
# http://docs.python.org/library/itertools.html#itertools.izip_longest
# get a list of open readers using a list comprehension
readers = [csv.reader(open(fname, "r")) for fname in list_of_filenames]
# open writer
output_csv = csv.writer(...)
for bunch_of_lines in izip_longest(*readers, fillvalue=['', '', '', '']):
# Here bunch_of_lines is a tuple of lines read from each reader,
# e.g. all first lines, all second lines, etc
# When one file is past EOF but others aren't, you get fillvalue for its line.
merged_row = []
for line in bunch_of_lines:
# if it's a real line, you have 4 items of data.
# if the file is past EOF, the line is fillvalue from above
# which again is guaranteed to have 4 items of data, all empty strings.
merged_row.extend([line[1], line[3]]) # put columns 1 and 3
output_csv.writerow(merged_row)
此代码仅在最长文件结束后停止,循环仅为5行代码。
我想你自己会明白的
注意:在Python中,在了解了for
循环和列表理解的工作原理之后,很少需要range()
和整数索引访问列表。在Python中,for
与其他语言中的foreach
一样;它与索引无关。假设您知道在某些文件比其他文件长时如何合并行。下面是一种使行和文件上的迭代更容易的方法
from itertools import izip_longest
# http://docs.python.org/library/itertools.html#itertools.izip_longest
# get a list of open readers using a list comprehension
readers = [csv.reader(open(fname, "r")) for fname in list_of_filenames]
# open writer
output_csv = csv.writer(...)
for bunch_of_lines in izip_longest(*readers, fillvalue=['', '', '', '']):
# Here bunch_of_lines is a tuple of lines read from each reader,
# e.g. all first lines, all second lines, etc
# When one file is past EOF but others aren't, you get fillvalue for its line.
merged_row = []
for line in bunch_of_lines:
# if it's a real line, you have 4 items of data.
# if the file is past EOF, the line is fillvalue from above
# which again is guaranteed to have 4 items of data, all empty strings.
merged_row.extend([line[1], line[3]]) # put columns 1 and 3
output_csv.writerow(merged_row)
此代码仅在最长文件结束后停止,循环仅为5行代码。
我想你自己会明白的
注意:在Python中,在了解了for
循环和列表理解的工作原理之后,很少需要range()
和整数索引访问列表。在Python中,for
与其他语言中的foreach
一样;它与索引无关。z=0
在中对于范围(i)中的z是不必要的:
谢谢,我已经修改了它。同样由于你的评论,我提高了I值。我将编辑代码以反映您的建议。您知道Python用于读取逗号分隔数据的csv
模块吗?z=0
在for z in range(I):
谢谢,我已对其进行了修改。同样由于你的评论,我提高了I值。我将编辑代码以反映您的建议。您知道Python的csv
模块用于读取逗号分隔的数据吗?如果您想编写csv文件,最好使用csv.writer
为您处理逗号和其他内容;模块csv
已导入以读取输入csv。如果您想编写csv文件,最好使用csv.writer
为您处理逗号和其他内容;模块csv
已经导入用于读取输入csv。这非常有效!我真的很接近让这个程序按照我想要的方式工作!谢谢我想投你一票,但我还不被允许。谢谢这很有效!我真的很接近让这个程序按照我想要的方式工作!谢谢我想投你一票,但我还不被允许。谢谢