首頁 > 軟體

Python批次將csv檔案編碼方式轉換為UTF-8的實戰記錄

2022-07-04 14:01:59

當我們用pandas是操作CSV檔案的時候,常常會因為編碼問題出現報錯。

pandas_libsparsers.pyx in pandas._libs.parsers.TextReader.read()

pandas_libsparsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas_libsparsers.pyx in pandas._libs.parsers.TextReader._read_rows()

pandas_libsparsers.pyx in pandas._libs.parsers.TextReader._convert_column_data()

pandas_libsparsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()

pandas_libsparsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()

pandas_libsparsers.pyx in pandas._libs.parsers.TextReader._string_convert()

pandas_libsparsers.pyx in pandas._libs.parsers._string_box_utf8()

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xca in position 0: invalid continuation byte

如果只是一兩個檔案,我們可以用系統自帶記事本的方法進行解決:

1、右鍵csv檔案,開啟方式選擇“記事本”開啟;
2、ctrl+shift+s另存為,將編碼方式由ansi給改為UTF-8,點選確定並替換原檔案。

嫌麻煩的也可以在每次用pandas讀取csv前加入以下程式碼。

import pandas as pd
filename='222.csv'
try:
    df = pd.read_csv(filename, encoding='utf-8')
except BaseException:
    df = pd.read_csv(filename, encoding='cp950')
    df.to_csv(filename, encoding='utf-8', index=False)

如果很多類似的ASCII的CSV檔案就會非常頭痛,下面我們用Python編寫一個程式,用來檢測並批次轉換csv檔案的編碼方式。

需要指出的是,這個程式並不完善,執行速度沒有進行優化,並且仍然有部分檔案未能轉換成功,但足以應對日常的分析需要。經過嘗試,有幾種csv檔案無法轉換:

1、包含圖片或者圖表的csv檔案

2、原先的csv檔案內容就是亂碼的

覺得有幫助,那請給這篇文章點個贊吧❤️

演示效果:

程式碼:

import os
from chardet.universaldetector import UniversalDetector

def get_filelist(path):
    """
    獲取路徑下所有csv檔案的路徑列表
    """
    Filelist = []
    for home, dirs, files in os.walk(path):
        for filename in files:
            if ".csv" in filename:
                Filelist.append(os.path.join(home, filename))
    return Filelist

def read_file(file):
    """
    逐個讀取檔案的內容
    """
    with open(file, 'rb') as f:
        return f.read()

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 convert_encode2utf8(file, original_encode, des_encode):
    """
    將檔案的編碼方式轉換為utf-8,並寫入原先的檔案中。
    """    
    file_content = read_file(file)
    file_decode = file_content.decode(original_encode, 'ignore')
    file_encode = file_decode.encode(des_encode)
    with open(file, 'wb') as f:
        f.write(file_encode)

def read_and_convert(path):
    """
    讀取檔案並轉換
    """
    Filelist = get_filelist(path=path)
    fileNum= 0
    for filename in Filelist:
        try:
            file_content = read_file(filename)
            encode_info = get_encode_info(filename)
            if encode_info != 'utf-8':
                fileNum +=1
                convert_encode2utf8(filename, encode_info, 'utf-8')
                print('成功轉換 %s 個檔案 %s '%(fileNum,filename))
        except BaseException:
            print(filename,'存在問題,請檢查!')

def recheck_again(path):
    """
    再次判斷檔案是否為utf-8
    """    
    print('---------------------以下檔案仍存在問題---------------------')
    Filelist = get_filelist(path)
    for filename in Filelist:
        encode_info_ch = get_encode_info(filename)
        if encode_info_ch != 'utf-8':
            print(filename,'的編碼方式是:',encode_info_ch)

    print('--------------------------檢查結束--------------------------')
if __name__ == "__main__":
    """
    輸入檔案路徑
    """    
    path = './'
    read_and_convert(path)
    recheck_again(path)
    print('轉換結束!')

核心程式碼是:

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']

Filelist = get_filelist(path=path)
fileNum= 0
for filename in Filelist:
    try:
        file_content = read_file(filename)
        encode_info = get_encode_info(filename)
        if encode_info != 'utf-8':
            fileNum +=1
            convert_encode2utf8(filename, encode_info, 'utf-8')
            print('成功轉換 %s 個檔案 %s '%(fileNum,filename))
            except BaseException:
                print(filename,'存在問題,請檢查!')

總結

到此這篇關於Python批次將csv檔案編碼方式轉換為UTF-8的文章就介紹到這了,更多相關Python批次轉換csv檔案編碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com