Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中组合长度未知但宽度相同的CSV文件列_Python_Csv - Fatal编程技术网

在Python中组合长度未知但宽度相同的CSV文件列

在Python中组合长度未知但宽度相同的CSV文件列,python,csv,Python,Csv,我有一个未知数量的输入csv文件,看起来或多或少像这样(设置宽度和长度) 输出如下所示 Header1,Header3, ,Header1,Header3, ,... 1,3, ,1,3, ,... ... 目前,我可以将所有输入文件读入字符串,我知道如何读取每个文件的第一行并以所需格式打印,但我一直在研究如何循环到每个文件的下一行并打印数据。由于文件在一端时长度不同,我不知道如何处理它,并将其放在空白处作为占位符以保持格式。下面是我的代码 csvs=[] 保持=[] i=0#开始时i=-1

我有一个未知数量的输入csv文件,看起来或多或少像这样(设置宽度和长度)

输出如下所示

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。这非常有效!我真的很接近让这个程序按照我想要的方式工作!谢谢我想投你一票,但我还不被允许。谢谢这很有效!我真的很接近让这个程序按照我想要的方式工作!谢谢我想投你一票,但我还不被允许。谢谢