使用Python将一个CSV文件的内容追加到另一个CSV文件中

7

我有两个csv文件:

  • output.csv
  • output1.csv

output.csv有5列标题。
output1.csv有大约40列不同类型的数据。

我需要将output1.csv的所有内容附加到output.csv中。如何做到这一点?
有人可以给我一个提示吗?
我有以下代码:

reader=csv.DictReader(open("test.csv","r"))
allrows = list(reader)

keepcols = [c for c in allrows[0] if all(r[c] != '0' for r in allrows)]

print keepcols
writer=csv.DictWriter(open("output.csv","w"),fieldnames='keepcols',extrasaction='ignore')
writer.writerows(allrows)

    with open("test1.csv","r") as f:
        fields=next(f).split()
        # print(fields)
        allrows=[]
        for line in f:
            line=line.split()
            row=dict(zip(fields,line))
            allrows.append(row)
            # print(row)
        keepcols = [c for c in fields if any(row[c] != '0' for row in allrows)]
        print keepcols
        writer=csv.DictWriter(open("output1.csv","w"),fieldnames=keepcols,extrasaction='ignore')
        writer.writerows(allrows)

test.csv 生成 output.csv
test1.csv 生成 output1.csv

我试图看看是否可以使两个文件将输出合并到同一个文件中...

4个回答

8
如果我正确理解您的问题,您想创建一个包含41列的csv文件——其中1列来自output.csv,其余40列来自output1.csv。如果它们的行数不同(如果不是这样的话——那么必须采取什么措施?),我假设它们有相同的行数。
尝试使用csv模块:
import csv
reader = csv.reader(open('output.csv', 'rb'))
reader1 = csv.reader(open('output1.csv', 'rb'))
writer = csv.writer(open('appended_output.csv', 'wb'))
for row in reader:
    row1 = reader1.next()
    writer.writerow(row + row1)

如果您的CSV文件使用特殊的分隔符或引用字符进行格式化,您可以使用csv.reader和csv.writer对象的可选关键字参数。 有关详细信息,请参见Python的csv模块文档...

编辑:添加了“b”标志,如建议所示。


4
这则讨论与你的需求非常相似,只不过对方想要连接mp3文件。链接如下:This 编辑:
import os, sys
target = '/path/to/target'
src1 = '/path/to/source1.csv'
src2 = '/path/to/source2.csv'
tf = open(target, 'a')
tf.write(open(src1).read())
tf.write(open(src2).read())
tf.close()

尝试这个,因为您只想执行相当于shell命令cat src1 src2 > target的操作,所以这应该可以工作。


但我猜CSV文件和MP3文件非常不同,那么你对我的问题有什么建议吗? - newbie

0

如果你想传递一个条件,你也可以使用阅读器中的生成器:

import csv
def read_generator(filepath:str):
   with open(filepath, 'rb'):
     reader = csv.reader(f)
     for row in reader:
       if row[0] == condition:
         yield row

然后从中编写:

writer = csv.writer(open("process.csv", "rb"))
write.writerow(read_generator(file_to_read.csv))

0
“我需要将output1.csv的所有内容追加到output.csv中。” 如果按照字面意思来理解,那么这意味着将第一个文件中的每一行写在第二个文件的每一行后面。这是你想要的吗?
“标题是什么?另一个文件中的40列?” 如果是这样的话,那么假设你希望将标题作为列标题的一行写入:
import csv
titles = [x[0] for x in csv.reader(open('titles.csv', 'rb'))]
writer = csv.writer(open('merged.csv', 'wb'))
writer.writerow(titles)
for row in csv.reader(open('data.csv', 'rb')):
    writer.writerow(row)

不,我不需要标题变成列标题... 我需要它们保持原样。 我只想将这其他40列附加到output.csv中,而根据你的说法它是“titles.csv”。 - newbie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接