[英]How to implement CSV Writer in a named temporary - 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 writer對象的部分介紹(加粗):
對於 Writer 對象,行必須是字符串或數字的可迭代對象,對於 DictWriter 對象,行必須是將字段名映射到字符串或數字的字典...
但是您傳遞的是一個字符串: "Adam,12"
。 發生什么了?
>>> for character in "Adam":
... print(character)
...
A
d
a
m
由於 Python 沒有不同的字符 class,因此每個單字符值也是一個字符串。 所以字符串是字符串的迭代。
當您將可迭代的字符串提供給csvwriter.writerow()
時,它將可迭代中的每個字符串寫入其自己的列。 在這種情況下,這意味着從輸入中獲取的單字符字符串。
要獲得您想要的行為,您需要將["Adam", 12]
(不是"Adam,12"
)之類的內容傳遞給 CSV 作者。 我不確定您的輸入來自何處,因此可能有更好的方法來執行此操作,但您可以在傳遞字符串時將其拆分為逗號:
for data in allData:
writer.writerow(data.split(","))
這是有效的,因為"Adam,12".split(",")
返回["Adam", "12"]
。 請注意,如果您的輸入有多個逗號,這將無法正常工作。
編輯:
如果allData
是字典列表,如您在編輯后的問題中所示,您最好使用DictWriter
而不是常規編寫器:
創建一個 object,它像普通的編寫器一樣運行,但將字典映射到 output 行。 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.