簡體   English   中英

如何在命名的臨時文件中實現 CSV Writer - Python?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM