python寫入csv中文亂碼問題,encoding='utf-8'無效仍是亂碼——呂江民·平常隨筆

今天在處理python寫入csv中文亂碼問題,嘗試各類辦法,百思不得其解,網上找到的最經常使用的辦法就是python

1. encoding='utf-8':無效

with open('data4.csv', 'a', encoding='utf-8', newline='') as csvfile:
    fieldnames = (['id', 'name', 'age'])
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writerow({'id': '10005', 'name': '張偉', 'age': '32'})

2. encoding='utf-8-sig':有效

with open(filename, 'a', newline='', encoding='utf-8-sig') as f: # 中文須要設置成utf-8格式
    f_csv = csv.writer(f)
    f_csv.writerow(('城市', '日期', '天氣', '風力', '溫度', '攝氏度')) # 頭部信息
    f_csv.writerows(data)

3. 先轉碼再儲存:無效

data.decode('utf-8').encode('gbk')

4. 甚至直接以gbk編碼寫入:無效

f = codecs.open("xx.csv", 'wb', "gbk")
writer = csv.writer(f)
writer.writerow(["客戶名稱", "行業類型", "客戶聯繫人", "職位", "聯繫方式", "郵箱","地址"])

到此爲止,中文仍是亂碼,我甚至開始懷疑個人excel軟件是否是壞了,,我用的是wps,是否是wps須要修改編碼方式?
image.png
WPS:想什麼呢,我糖糖WPS怎麼可能讓你隨便轉換編碼,我又不是Notepad++,我是高貴的office!緩存

打開csv源碼發現dialect="excel"

反思一下,是否是由於csv太Low了,因而居然成功了!!!絲絕不敢代碼,趕忙貼出來,以防還有新手朋友擺渡擺到翻船。拿走不謝...編碼

writer = csv.DictWriter(csvfile, fieldnames=fieldnames, dialect="excel")
貼上源碼:
class DictWriter:
    def __init__(self, f, fieldnames, restval="", extrasaction="raise",
                 dialect="excel", *args, **kwds):
        self.fieldnames = fieldnames    # list of keys for the dict
        self.restval = restval          # for writing short dicts
        if extrasaction.lower() not in ("raise", "ignore"):
            raise ValueError("extrasaction (%s) must be 'raise' or 'ignore'"
                             % extrasaction)
        self.extrasaction = extrasaction
        self.writer = writer(f, dialect, *args, **kwds)

    def writeheader(self):
        header = dict(zip(self.fieldnames, self.fieldnames))
        self.writerow(header)

    def _dict_to_list(self, rowdict):
        if self.extrasaction == "raise":
            wrong_fields = rowdict.keys() - self.fieldnames
            if wrong_fields:
                raise ValueError("dict contains fields not in fieldnames: "
                                 + ", ".join([repr(x) for x in wrong_fields]))
        return (rowdict.get(key, self.restval) for key in self.fieldnames)

    def writerow(self, rowdict):
        return self.writer.writerow(self._dict_to_list(rowdict))

    def writerows(self, rowdicts):
        return self.writer.writerows(map(self._dict_to_list, rowdicts))

吃完飯回來發現是python緩存致使,其實encoding='utf-8-sig'是有效,但當時測了不少遍都沒生效,緩存誤國啊,dialect默認值就是"excel",不須要修改。spa

相關文章
相關標籤/搜索