基本上,我需要最后一个csv文件,其内容看起来像头,然后数据:(Boto3 upload_file执行将临时文件写入csv的工作)
- 期望值:*
Name,Code
Adam,12
我可以通过使用以下方法获得此结果:
with tempfile.NamedTemporaryFile(mode="a+t", suffix =".csv", delete=True) as fileName:
for data in allData:
fileName.write(data)
fileName.flush()
但是,当我使用csv.writer时:
writer = csv.write(fileName)
with tempfile.NamedTemporaryFile(mode="a+t", suffix =".csv", delete=True) as fileName:
for data in allData:
writer.writerow(data)
- 现实 *
N,a,m,e","C,o,d,e
A,d,a,m","1,2"
使用Python 3.8allData
看起来像:[{'name': 'Adam', 'code': '12', 'points': 9.7, 'age': '34'}, {{'name': 'Sam', 'code': '13', 'points': 8.4, 'age': '34'}]
。(有1000个类似的数据,使用上下文只过滤掉这些值。)
数据如下所示:亚当12岁
需要用csv编写器来帮助写这个。我已经看到了StringIO的参考被用来修复类似的情况,但不知道如何实现。有出路吗?
1条答案
按热度按时间p5cysglq1#
这与临时目录无关。
下面是有关CSV编写器对象的部分介绍(粗体添加):
对于Writer对象,* 行 * 必须是字符串或数字的可迭代项,对于DictWriter对象,* 行 * 必须是将字段名Map到字符串或数字的字典...
但您传递的是一个 single 字符串:
"Adam,12"
。到底怎么回事?字符串本身是字符串中字符的可迭代对象:
因为Python没有一个独特的字符类,所以每一个单字符值也是一个字符串,所以字符串是字符串的可迭代对象。
当你给予
csvwriter.writerow()
一个字符串的可迭代对象时,它会把可迭代对象中的每个字符串写入它自己的列中,在这种情况下,这意味着从输入中取出一个字符串。为了得到你想要的行为,你需要传递类似
["Adam", 12]
(而不是"Adam,12"
)的代码给CSV编写器。我不确定你的输入来自哪里,所以可能有更好的方法来实现,但是你可以在传递字符串时用逗号分隔它们:这是因为
"Adam,12".split(",")
返回["Adam", "12"]
。请注意,如果您的输入包含多个逗号,这将无法正常工作。编辑:
如果
allData
是一个字典列表,正如你在编辑后的问题中所展示的,你可能更好地使用DictWriter
而不是一个普通的作家:创建一个对象,该对象的操作类似于常规写入器,但将字典Map到输出行。fieldnames 参数是一个键序列,用于标识传递给
writerow()
方法的字典中的值写入文件 f 的顺序。换句话说,类似这样的东西: