[英]Python csv writer adds quotes on empty first line, but not subsequent lines
我正在嘗試使用python的csv
標准庫模塊來生成逗號分隔值(csv)文件。
不允許第一行為空白。 更煩人的是,它將第一行與其他行區別對待,因此一個空列表在一種情況下會給出一個空字符串(“”),然后是一個空行:
import csv
import io
def make_csv(rows):
with io.StringIO(newline='') as sout:
writer = csv.writer(sout, quoting=csv.QUOTE_MINIMAL)
writer.writerows(rows)
return sout.getvalue()
給定以上定義,解釋器會話可能類似於:
>>> make_csv([[''], ['']]) # (only the) first line has quoted empty string
'""\r\n\r\n'
>>> make_csv([['A'], ['A']]) # expected: same input row, same output row
'A\r\nA\r\n'
為什么用引號引起的空字符串僅出現在第一行? 有什么辦法可以阻止它,或者至少獲得更一致的行為?
更新 :這是2017年12月報告為https://bugs.python.org/issue32255的錯誤,並通過提交https://github.com/python/cpython/commit/2001900b0c02a397d8cf1d776a7cc7fcb2a463e3解決,該錯誤已包含在3.6中。 5發布
您可以通過設置其他引用策略來強制csv編寫器引用空字符串。 QUOTE_ALL和QUOTE_NONNUMERIC都將執行您想要的操作:
def make_csv(rows):
with io.StringIO(newline='') as sout:
writer = csv.writer(sout, quoting=csv.QUOTE_NONNUMERIC)
writer.writerows(rows)
return sout.getvalue()
>>> make_csv([[''], ['']])
'""\r\n""\r\n'
我不知道為什么默認策略將第一行與其他行區別對待,但是我認為這是一個錯誤。 如果您嘗試在第二行未加引號的地方加載csv數據,則會注意到輸出與最初用於創建csv的輸入不同:
>>> data = [[''], ['']]
>>> text = make_csv(data)
>>> text
'""\r\n\r\n'
>>> f = io.StringIO(text)
>>> reader = csv.reader(f)
>>> list(reader)
[[''], []]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.