標籤:image 字串轉換 close 建議 ima windows enc 報錯 write
前言
python2最大的坑在於中文編碼問題,遇到中文報錯首先加u,再各種encode、decode。
當list、tuple、dict裡面有中文時,列印出來的是Unicode編碼,這個是無解的。
對中文編碼糾結的建議儘快換python3吧,python2且用且珍惜!
csv中文亂碼
1.open開啟csv檔案,用writer寫入帶有中文的資料時
# coding:utf-8import csvf = open("xieru.csv", ‘wb‘)writer = csv.writer(f)# 需要寫入的資訊data = ["客戶名稱", "行業類型", "客戶連絡人", "職位", "連絡方式", "郵箱","地址"]writer.writerow(data) # 寫入單行# writer.writerows(datas) # 寫入多行f.close()
2.開啟csv檔案,發現寫入的中文亂碼了
編碼與解碼
1.中文亂碼問題一直是python2揮之不去的痛,這裡先弄清楚亂碼原因:
- python2本身內部代碼的編碼有str和unicode兩種編碼
- 然而檔案寫入到windows系統時候,windows上的是gb2312編碼
所以就導致了亂碼問題
2.先把python裡面的中文字串decode成utf-8,再encode為gbk編碼
data.decode(‘utf-8‘).encode(‘gbk‘)
3.如果是讀取csv檔案的話,就反過來:
data.decode(‘gbk‘).encode(‘utf-8‘)
解決方案
1.方案一:對字串轉換編碼(這個太麻煩了,不推薦)
# coding:utf-8import csvf = open("xieru1.csv", ‘wb‘)writer = csv.writer(f)# 需要寫入的資訊data = ["客戶名稱", "行業類型", "客戶連絡人", "職位", "連絡方式", "郵箱","地址"]a = []for i in data: a.append(i.decode("utf-8").encode("gbk"))writer.writerow(a) # 寫入單行# writer.writerows(datas) # 寫入多行f.close()
2.方法二:用codecs提供的open方法來指定開啟的檔案的語言編碼,它會在讀取的時候自動轉換為內部unicode (推薦)
# coding:utf-8import csv, codecsimport sysreload(sys)sys.setdefaultencoding(‘utf8‘)f = codecs.open("xx.csv", ‘wb‘, "gbk")writer = csv.writer(f)writer.writerow(["客戶名稱", "行業類型", "客戶連絡人", "職位", "連絡方式", "郵箱","地址"])# 多組資料存放list列表裡面datas = [ ["客戶名稱", "行業類型", "客戶連絡人", "職位", "連絡方式", "郵箱","地址"], ["客戶名稱", "行業類型", "客戶連絡人", "職位", "連絡方式", "郵箱","地址"], ["客戶名稱", "行業類型", "客戶連絡人", "職位", "連絡方式", "郵箱","地址"], ]writer.writerows(datas)f.close()
從悠悠處搬過來的。
Python在向CSV檔案寫中文時亂碼的處理辦法