前言:
公司同事邀我一起給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不對, 打開內容是亂碼
