Python批量將csv文件編碼方式轉換為UTF-8的實戰(zhàn)記錄
當我們用pandas是操作CSV文件的時候,常常會因為編碼問題出現(xiàn)報錯。
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
如果只是一兩個文件,我們可以用系統(tǒng)自帶記事本的方法進行解決:
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文件的編碼方式。
需要指出的是,這個程序并不完善,運行速度沒有進行優(yōu)化,并且仍然有部分文件未能轉換成功,但足以應對日常的分析需要。經過嘗試,有幾種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文件編碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Using Django with GAE Python 后臺抓取多個網站的頁面全文
這篇文章主要介紹了Using Django with GAE Python 后臺抓取多個網站的頁面全文,需要的朋友可以參考下2016-02-02

