前言:
公司同事邀我一起給SQLSERVER 2008導數, 數據來源有高斯和ORACLE, 數據文件保存格式有UTF-8和GBK。
當我在做測試導入的時候發現SQLSERVER 2008數據庫的WITH選項不支持CODEPAGE='65001', 即UTF-8文件編碼格式導入。 所以需要把UTF-8編碼的文件
統一轉換成GBK, 代碼如下。
示例一:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # python fileConv source_file dest_file import os, sys import chardet source_file = sys.argv[1] # 源文件 dest_file = sys.argv[2] # 轉后的目標文件 # 確定源文件字符編碼 for row in open(source_file, 'rb'): tmp = chardet.detect(row) language = tmp.get("encoding") if language.upper == 'UTF-8': charset = "UTF-8" else: charset = "GB18030" break # 將文件轉換成GBK編碼 with open(dest_file, 'w', encoding="GB18030") as fp: for row in open(source_file,'r', encoding=charset): fp.write(row)
在轉換生產數據的時候還算好用, 但有些字符還是無法很好的識別, 導致轉換失敗。
在網上又看到了一個專門用來編碼轉換的包:codecs, 用法大同小異
示例二:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # python fileConv source_file dest_file import os, sys import chardet import codecs source_file = sys.argv[1] # 源文件 dest_file = sys.argv[2] # 轉后的目標文件 # 確定源文件字符編碼 for row in open(source_file, 'rb'): tmp = chardet.detect(row) language = tmp.get("language") if language == 'Chinese': charset = "GB18030" else: charset = "UTF-8" break # 將文件轉換成GBK編碼 fp = codecs.open(dest_file, 'w', encoding="GB18030") # 中文編碼寫入 for row in codecs.open(source_file, 'r', encoding=charset): # 指定編碼讀 fp.write(row)
fp.close()
知識小記:
通過 Unicode 編碼來進行不同編碼之間的相互轉化
1、不同的編碼之間不能互相識別,不能相互轉化,會報錯或出現亂碼
2、國際通用標准:文字通過網絡傳輸、或硬盤存儲等不能使用 Unicode 編碼方式,因為 Unicode 使用的是升級版 32 位的,太費流量和空間
3、在 Python3 版本中,唯獨 string 在內存中的編碼方式是 Unicode,所以字符串不能直接進行網絡傳輸及進行文件的存儲
4、bytes:也是一種數據類型,不是字節,與 string 類型就像是孿生兄弟
5、為啥要有 bytes ?—— bytes 內部編碼不是 Unicode 方式,因此可以進行網絡傳輸和文件的存儲
6、不同編碼之間相互轉化都需要先變成unicode編碼, encode編碼, decode解碼
示例:
s1 = "中國" b=s1.encode("gbk") s2 = b.decode("gbk") s3=u"中國" print(s1) print(b) print(s2) print(s1==s2==s3) 結果 : 中國 b'\xd6\xd0\xb9\xfa' 中國 True
在python3版本中, 字符串的編碼方式就是Unicode, 所以中國==u"中國"
各系統的默認編碼方式
WINDOWS: GBK
LINUX: UTF-8
IOS: UTF-8
示例:
# windows下生成的文件打開方式 with open(r"d:\test.txt") as fp: print(fp.read()) # linux下生成文件的打開方式 with open(r"d:\test.txt", encoding="utf-8") as fp: print(fp.read())
如果encoding不對, 打開內容是亂碼