如何在命名的临时Python中实现CSV Writer?

jk9hmnmh  于 2022-11-28  发布在  Python
关注(0)|答案(1)|浏览(141)

基本上,我需要最后一个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.8
allData看起来像:[{'name': 'Adam', 'code': '12', 'points': 9.7, 'age': '34'}, {{'name': 'Sam', 'code': '13', 'points': 8.4, 'age': '34'}]。(有1000个类似的数据,使用上下文只过滤掉这些值。)
数据如下所示:亚当12岁
需要用csv编写器来帮助写这个。我已经看到了StringIO的参考被用来修复类似的情况,但不知道如何实现。有出路吗?

p5cysglq

p5cysglq1#

这与临时目录无关。
下面是有关CSV编写器对象的部分介绍(粗体添加):
对于Writer对象,* 行 * 必须是字符串或数字的可迭代项,对于DictWriter对象,* 行 * 必须是将字段名Map到字符串或数字的字典...
但您传递的是一个 single 字符串:"Adam,12"。到底怎么回事?
字符串本身是字符串中字符的可迭代对象:

>>> for character in "Adam":
...     print(character)
...
A
d
a
m

因为Python没有一个独特的字符类,所以每一个单字符值也是一个字符串,所以字符串是字符串的可迭代对象。
当你给予csvwriter.writerow()一个字符串的可迭代对象时,它会把可迭代对象中的每个字符串写入它自己的列中,在这种情况下,这意味着从输入中取出一个字符串。
为了得到你想要的行为,你需要传递类似["Adam", 12](而不是"Adam,12")的代码给CSV编写器。我不确定你的输入来自哪里,所以可能有更好的方法来实现,但是你可以在传递字符串时用逗号分隔它们:

for data in allData:
    writer.writerow(data.split(","))

这是因为"Adam,12".split(",")返回["Adam", "12"]。请注意,如果您的输入包含多个逗号,这将无法正常工作。

编辑:

如果allData是一个字典列表,正如你在编辑后的问题中所展示的,你可能更好地使用DictWriter而不是一个普通的作家:
创建一个对象,该对象的操作类似于常规写入器,但将字典Map到输出行。fieldnames 参数是一个键序列,用于标识传递给writerow()方法的字典中的值写入文件 f 的顺序。
换句话说,类似这样的东西:

with open("foo.csv", "w") as f:
    writer = csv.DictWriter(f, ["name", "code", "points", "age"])
    for data in [{"name": "Adam", "code": 12, "points": 0, "age": 18}]:
        writer.writerow(data)

相关问题