Python批量將csv文件編碼方式轉(zhuǎn)換為UTF-8的實(shí)戰(zhàn)記錄
當(dāng)我們用pandas是操作CSV文件的時(shí)候,常常會(huì)因?yàn)榫幋a問(wèn)題出現(xiàn)報(bào)錯(cuò)。
pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader.read()
pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()
pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_rows()
pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_column_data()
pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()
pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()
pandas_libs\parsers.pyx in pandas._libs.parsers.TextReader._string_convert()
pandas_libs\parsers.pyx in pandas._libs.parsers._string_box_utf8()
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xca in position 0: invalid continuation byte
如果只是一兩個(gè)文件,我們可以用系統(tǒng)自帶記事本的方法進(jìn)行解決:
1、右鍵csv文件,打開(kāi)方式選擇“記事本”打開(kāi);
2、ctrl+shift+s另存為,將編碼方式由ansi給改為UTF-8,點(diǎn)擊確定并替換原文件。
嫌麻煩的也可以在每次用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)
如果很多類(lèi)似的ASCII的CSV文件就會(huì)非常頭痛,下面我們用Python編寫(xiě)一個(gè)程序,用來(lái)檢測(cè)并批量轉(zhuǎn)換csv文件的編碼方式。
需要指出的是,這個(gè)程序并不完善,運(yùn)行速度沒(méi)有進(jìn)行優(yōu)化,并且仍然有部分文件未能轉(zhuǎn)換成功,但足以應(yīng)對(duì)日常的分析需要。經(jīng)過(guò)嘗試,有幾種csv文件無(wú)法轉(zhuǎn)換:
1、包含圖片或者圖表的csv文件
2、原先的csv文件內(nèi)容就是亂碼的
覺(jué)得有幫助,那請(qǐng)給這篇文章點(diǎn)個(gè)贊吧??
演示效果:
代碼:
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): """ 逐個(gè)讀取文件的內(nèi)容 """ with open(file, 'rb') as f: return f.read() def get_encode_info(file): """ 逐個(gè)讀取文件的編碼方式 """ 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): """ 將文件的編碼方式轉(zhuǎn)換為utf-8,并寫(xiě)入原先的文件中。 """ 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): """ 讀取文件并轉(zhuǎn)換 """ 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('成功轉(zhuǎn)換 %s 個(gè)文件 %s '%(fileNum,filename)) except BaseException: print(filename,'存在問(wèn)題,請(qǐng)檢查!') def recheck_again(path): """ 再次判斷文件是否為utf-8 """ print('---------------------以下文件仍存在問(wèn)題---------------------') 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('--------------------------檢查結(jié)束--------------------------') if __name__ == "__main__": """ 輸入文件路徑 """ path = './' read_and_convert(path) recheck_again(path) print('轉(zhuǎn)換結(jié)束!')
核心代碼是:
def get_encode_info(file): """ 逐個(gè)讀取文件的編碼方式 """ 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('成功轉(zhuǎn)換 %s 個(gè)文件 %s '%(fileNum,filename)) except BaseException: print(filename,'存在問(wèn)題,請(qǐng)檢查!')
總結(jié)
到此這篇關(guān)于Python批量將csv文件編碼方式轉(zhuǎn)換為UTF-8的文章就介紹到這了,更多相關(guān)Python批量轉(zhuǎn)換csv文件編碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用正則表達(dá)式過(guò)濾或替換HTML標(biāo)簽的方法詳解
這篇文章主要介紹了Python使用正則表達(dá)式過(guò)濾或替換HTML標(biāo)簽的方法,簡(jiǎn)單介紹了Python正則相關(guān)語(yǔ)法并結(jié)合具體實(shí)例形式分析了Python基于正則表達(dá)式的HTML標(biāo)簽過(guò)濾與替換相關(guān)操作技巧,需要的朋友可以參考下2017-09-09Python 中最長(zhǎng)公共子序列的長(zhǎng)度
子序列是在不改變剩余字符的順序的情況下,在刪除一些字符或不刪除任何字符后從給定序列獲得的序列,這篇文章主要介紹了Python 中的最長(zhǎng)公共子序列,需要的朋友可以參考下2023-06-06python使用turtle庫(kù)繪制奧運(yùn)五環(huán)
turtle也叫海龜,是turtle繪圖體系的python實(shí)現(xiàn),這篇文章主要介紹了python使用turtle庫(kù)繪制奧運(yùn)五環(huán),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-02-02Using Django with GAE Python 后臺(tái)抓取多個(gè)網(wǎng)站的頁(yè)面全文
這篇文章主要介紹了Using Django with GAE Python 后臺(tái)抓取多個(gè)網(wǎng)站的頁(yè)面全文,需要的朋友可以參考下2016-02-02基于python介紹pytorch保存和恢復(fù)參數(shù)
這篇文章主要介紹了基于python介紹pytorch保存和恢復(fù)參數(shù),為了恢復(fù)模型,我們需要用代碼生成框架,然后從磁盤(pán)加載參數(shù),下面具體的相關(guān)介紹,需要的小伙伴可以參考一下2022-03-03簡(jiǎn)單聊聊Python中多線(xiàn)程與類(lèi)方法的交互
在Python編程中,多線(xiàn)程是一種提高程序運(yùn)行效率的有效手段,本文將通過(guò)簡(jiǎn)潔的語(yǔ)言、清晰的邏輯和實(shí)際的代碼案例,探討Python多線(xiàn)程如何調(diào)用類(lèi)方法,感興趣的可以了解下2025-01-01pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例
本文主要介紹了pandas預(yù)處理部分地區(qū)數(shù)據(jù)案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01