網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
當(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é)
原文鏈接:https://blog.csdn.net/weixin_42750611/article/details/124111165
相關(guān)推薦
- 2022-05-20 如何保證緩存和數(shù)據(jù)庫(kù)的一致性?
- 2022-05-11 python列表推導(dǎo)式的原理及使用方法_python
- 2022-05-01 Qt實(shí)戰(zhàn)案例之如何利用QProcess類(lèi)實(shí)現(xiàn)啟動(dòng)進(jìn)程_C 語(yǔ)言
- 2023-11-25 優(yōu)化計(jì)算屬性mapState、mapGetters和methods的mapActions、mapMu
- 2022-07-13 Dos攻擊Tomcat導(dǎo)致coredump問(wèn)題分析
- 2022-04-08 從頭學(xué)習(xí)C語(yǔ)言之字符串處理函數(shù)_C 語(yǔ)言
- 2022-04-09 python的函數(shù)參數(shù)你了解嗎_python
- 2023-04-12 Python?issubclass和isinstance函數(shù)的具體使用_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支