如何实现CSV Writer在一个命名的临时- Python?



基本上,我需要最后一个csv文件,其内容看起来像Header,然后是数据:(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个这样的数据,使用上下文只过滤掉这些值。)

一个数据看起来像:Adam,12

需要帮助写这与csv作家。我看到StringIO被用来修复类似的情况,但不知道如何实现的参考。有出路吗?

这与临时目录没有任何关系。

这是关于CSV写入器对象的部分介绍(加粗):

row必须是字符串或数字的可迭代对象用于Writer对象和将字段名映射到字符串或数字的字典…for dictwwriter对象

但是您传入的是一个单个字符串:"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而不是常规的writer:

创建一个像普通writer一样操作的对象,但将字典映射到输出行。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)

最新更新