欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 轉(zhuǎn)換文本編碼實現(xiàn)解析

 更新時間:2019年08月27日 17:06:33   作者:danvy617  
這篇文章主要介紹了Python 轉(zhuǎn)換文本編碼實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值

最近在做周報的時候,需要把csv文本中的數(shù)據(jù)提取出來制作表格后生產(chǎn)圖表。

在獲取csv文本內(nèi)容的時候,基本上都是用with open(filename, encoding ='UTF-8') as f:來打開csv文本,但是實際使用過程中發(fā)現(xiàn)有些csv文本并不是utf-8格式,從而導(dǎo)致程序在run的過程中報錯,每次都需要手動去把該文本文件的編碼格式修改成utf-8,再次來run該程序,所以想說:直接在程序中判斷并修改文本編碼。

基本思路:先查找該文本是否是utf-8的編碼,如果不是則修改為utf-8編碼的文本,然后再處理。

python有chardet庫可以查看到文本的encoding信息:

detect函數(shù)只需要一個 非unicode字符串參數(shù),返回一個字典(例如:{'encoding': 'utf-8', 'confidence': 0.99})。該字典包括判斷到的編碼格式及判斷的置信度。

import chardet
def get_encode_info(file):
  with open(file, 'rb') as f:
    return chardet.detect(f.read())['encoding']

不過這個在從處理小文件的時候性能還行,如果文本稍微過大就很慢了,目前我本地的csv文件是近200k,就能明顯感覺到速度過慢了,效率低下。不過chardet庫中提供UniversalDetector對象來處理:創(chuàng)建UniversalDetector對象,然后對每個文本塊重復(fù)調(diào)用其feed方法。如果檢測器達到了最小置信閾值,它就會將detector.done設(shè)置為True。

一旦您用完了源文本,請調(diào)用detector.close(),這將完成一些最后的計算,以防檢測器之前沒有達到其最小置信閾值。結(jié)果將是一個字典,其中包含自動檢測的字符編碼和置信度(與charde.test函數(shù)返回的相同)。

from chardet.universaldetector import UniversalDetector
def get_encode_info(file):
 with open(file, 'rb') as f:
    detector = UniversalDetector()
 for line in f.readlines():
      detector.feed(line)
 if detector.done:
 break
    detector.close()
 return detector.result['encoding']

在做編碼轉(zhuǎn)換的時候遇到問題:UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 178365: character maps to <undefined>

def read_file(file):
 with open(file, 'rb') as f:
 return f.read()
def write_file(content, file):
 with open(file, 'wb') as f:
    f.write(content)
def convert_encode2utf8(file, original_encode, des_encode):
  file_content = read_file(file)
  file_decode = file_content.decode(original_encode)  #-->此處有問題
  file_encode = file_decode.encode(des_encode)
  write_file(file_encode, file)

這是由于byte字符組沒解碼好,要加另外一個參數(shù)errors。官方文檔中寫道:

bytearray.decode(encoding=”utf-8”, errors=”strict”)

Return a string decoded from the given bytes. Default encoding is 'utf-8'. errors may be given to set a different error handling scheme. The default for errors is 'strict', meaning that encoding errors raise a UnicodeError. Other possible values are 'ignore', 'replace' and any other name registered via codecs.register_error(), see section Error Handlers. For a list of possible encodings, see section Standard Encodings.

意思就是字符數(shù)組解碼成一個utf-8的字符串,可能被設(shè)置成不同的處理方案,默認是‘嚴格'的,有可能拋出UnicodeError,可以改成‘ignore','replace'就能解決。

所以將此行代碼file_decode = file_content.decode(original_encode)修改成file_decode = file_content.decode(original_encode,'ignore')即可。

完整代碼:

from chardet.universaldetector import UniversalDetector

def get_encode_info(file):
 with open(file, 'rb') as f:
   detector = UniversalDetector()
   for line in f.readlines():
     detector.feed(line)
     if detector.done:
       break
   detector.close()
   return detector.result['encoding']

def read_file(file):
  with open(file, 'rb') as f:
    return f.read()

def write_file(content, file):
  with open(file, 'wb') as f:
    f.write(content)

def convert_encode2utf8(file, original_encode, des_encode):
  file_content = read_file(file)
  file_decode = file_content.decode(original_encode,'ignore')
  file_encode = file_decode.encode(des_encode)
  write_file(file_encode, file)

if __name__ == "__main__":
  filename = r'C:\Users\danvy\Desktop\Automation\testdata\test.csv'
  file_content = read_file(filename)
  encode_info = get_encode_info(filename)
  if encode_info != 'utf-8':
    convert_encode2utf8(filename, encode_info, 'utf-8')
  encode_info = get_encode_info(filename)
  print(encode_info)

參考:https://chardet.readthedocs.io/en/latest/usage.html

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 用pip給python安裝matplotlib庫的詳細教程

    用pip給python安裝matplotlib庫的詳細教程

    這篇文章主要介紹了用pip給python安裝matplotlib庫的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Python?中的?Counter?模塊及使用詳解(搞定重復(fù)計數(shù))

    Python?中的?Counter?模塊及使用詳解(搞定重復(fù)計數(shù))

    Counter 是一個簡單的計數(shù)器,用于統(tǒng)計某些可哈希對象的數(shù)量。它以字典的形式存儲元素和它們的計數(shù),這篇文章主要介紹了Python?中的?Counter?模塊及使用詳解(搞定重復(fù)計數(shù)),需要的朋友可以參考下
    2023-04-04
  • python+numpy+matplotalib實現(xiàn)梯度下降法

    python+numpy+matplotalib實現(xiàn)梯度下降法

    這篇文章主要為大家詳細介紹了python+numpy+matplotalib實現(xiàn)梯度下降法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • python 列表中[ ]中冒號‘:’的作用

    python 列表中[ ]中冒號‘:’的作用

    中括號[ ]:用于定義列表或引用列表、數(shù)組、字符串及元組中元素位置,冒號: 用于定義分片、步長。這篇文章給大家介紹python 列表中[ ]中冒號‘:’的作用,感興趣的的朋友跟隨小編一起看看吧
    2019-04-04
  • 基于Python制作ASCII碼轉(zhuǎn)換器

    基于Python制作ASCII碼轉(zhuǎn)換器

    ASCII碼是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。本文將利用Python制作一個ASCII碼轉(zhuǎn)換器,感興趣的可以動手試一試
    2022-02-02
  • Python算術(shù)運算符實例詳解

    Python算術(shù)運算符實例詳解

    這篇文章主要介紹了Python算術(shù)運算符實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Python字典底層實現(xiàn)原理詳解

    Python字典底層實現(xiàn)原理詳解

    今天小編就為大家分享一篇Python字典底層實現(xiàn)原理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python時區(qū)設(shè)置方法與pytz查詢時區(qū)教程

    Python時區(qū)設(shè)置方法與pytz查詢時區(qū)教程

    這篇文章主要介紹了Python時區(qū)設(shè)置的方法和pytz查詢時區(qū)的方法,大家參考使用吧
    2013-11-11
  • PyQt5 界面顯示無響應(yīng)的實現(xiàn)

    PyQt5 界面顯示無響應(yīng)的實現(xiàn)

    這篇文章主要介紹了PyQt5 界面顯示無響應(yīng)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Pytorch關(guān)于Dataset?的數(shù)據(jù)處理

    Pytorch關(guān)于Dataset?的數(shù)據(jù)處理

    這篇文章主要介紹了Pytorch關(guān)于Dataset?的數(shù)據(jù)處理,學(xué)習(xí)如何對卷積神經(jīng)網(wǎng)絡(luò)編程;首先,需要了解Pytorch對數(shù)據(jù)的使用,也是在我們模型流程中對數(shù)據(jù)的預(yù)處理部分,下面我們就一起進入文章查看具體處理過程吧
    2021-12-12

最新評論