我必须使用csv文件,每个文件有2列,其中之一是日期。我想将第二个文件的第二列添加到第一个文件中,从而得到一个具有3列的文件。
我是通过创建一个新文件并将数据追加到它的方式来做到这一点的:
import csv
coinsfile = open('total-bitcoins.csv', newline='')
pricesfile = open('market-price.csv', newline='')
coins = csv.reader(coinsfile, delimiter=',')
prices = csv.reader(pricesfile, delimiter=',')
with open('result.csv', 'w') as res:
for coin_row, price_row in zip(coins, prices):
line = str(coin_row[0]) + ',' + str(coin_row[1]) + ',' + str(price_row[1])
res.append(line)
代码可以正常运行,但是结果是一个csv文件,该文件完全为空。
我在哪里犯错,还是有更好的方法来完成这项工作?
答案 0 :(得分:1)
res
是文件句柄,因此append
方法不适用于它。因此,在打开输出文件时会出现属性错误,这会导致输出文件为空(或者是,输入文件之一为空,立即结束zip
,但是此答案说明了如何解决下一个问题)
一个快速修复程序是:
res.write(line+"\n")
但是最好的方法是将zip
的结果展平并将其馈送到csv.writer
对象(使用理解通过将两个csv输入行相加来生成每一行)
import csv
with open('result.csv', 'w', newline="") as res, open('total-bitcoins.csv', newline='') as coinsfile, open('market-price.csv', newline='') as pricesfile:
coins = csv.reader(coinsfile)
prices = csv.reader(pricesfile)
cw = csv.writer(res)
cw.writerows(coin_rows+price_row for coin_row, price_row in zip(coins, prices))
请注意,编写文件(Python 3)时需要newline=""
,以避免运行Windows时臭名昭著的空行“ bug”
我在with
语句中添加了输入文件,以确保退出时关闭输入。并且还删除了delimiter参数,因为默认值是逗号。