python3對文件編碼的轉換處理


  前言:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM