網站首頁 編程語言 正文
當我們用pandas是操作CSV文件的時候,常常會因為編碼問題出現報錯。
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
如果只是一兩個文件,我們可以用系統自帶記事本的方法進行解決:
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,'存在問題,請檢查!')
總結
原文鏈接:https://blog.csdn.net/weixin_42750611/article/details/124111165
相關推薦
- 2022-07-14 Android實現手機多點觸摸畫圓_Android
- 2022-10-06 Python3中常見配置文件寫法匯總_python
- 2022-09-26 數據庫基本增刪改查語法和多表鏈接查詢的方式
- 2022-06-18 android實現在圖標上顯示數字_Android
- 2022-04-16 C語言棧之順序棧_C 語言
- 2021-12-09 Android音頻開發之錄制音頻(WAV及MP3格式)_Android
- 2022-11-23 Shell執行腳本并輸出日志文件的方法_linux shell
- 2022-04-15 python尋找含有關鍵字文件和刪除文件夾方式_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支