今天在處理python寫入csv中文亂碼問題,嘗試各類辦法,百思不得其解,網上找到的最經常使用的辦法就是python
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'})
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)
data.decode('utf-8').encode('gbk')
f = codecs.open("xx.csv", 'wb', "gbk") writer = csv.writer(f) writer.writerow(["客戶名稱", "行業類型", "客戶聯繫人", "職位", "聯繫方式", "郵箱","地址"])
到此爲止,中文仍是亂碼,我甚至開始懷疑個人excel軟件是否是壞了,,我用的是wps,是否是wps須要修改編碼方式?
。
WPS:想什麼呢,我糖糖WPS怎麼可能讓你隨便轉換編碼,我又不是Notepad++,我是高貴的office!緩存
反思一下,是否是由於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