使用chardet检测编码

时间:2019-01-27 15:33:20

标签: python python-3.x unicode

我已经获得文件的编码,但是编码仍然存在错误。我不知道如何解决这个问题。谁能帮我吗?

代码:

import pandas as pd
import numpy as np
import os
import chardet
os.chdir(r'C:\Users\DELL\Desktop\beijing_20140101-20141231\beijing_20140101-20141231\beijingall')
file_chdir = os.getcwd()

filecsv_list = []
for root,dirs,files in os.walk(file_chdir):
    for file in files:
        if os.path.splitext(file)[1] == '.csv':
            filecsv_list.append(file)

data = pd.DataFrame()

for csv in filecsv_list:

    csvc=csv.encode()
    encoding=chardet.detect(csvc).get("encoding")
    print(encoding)

    b=pd.read_csv(csv,encoding=encoding,header=None,sep=',',engine='python')

错误: UnicodeDecodeError:'ascii'编解码器无法解码位置15的字节0xe4:序数不在范围(128)中

详细错误:

Error

================================================ ================================

谢谢大家!

我已经完成了。我没有注意到其中一个文件可能是一个问题。真正的问题是其中一个文件出现了乱码。删除此文件,然后尝试encoding ='utf8'可以帮助我解决此问题。

3 个答案:

答案 0 :(得分:3)

charget被传递样本数据。您正在传递文件名字符串本身,编码为UTF-8(其中ASCII是它的一个子集),因此您只会得到asciiutf-8作为答案。读取文件或使用二进制模式读取文件的至少一部分,然后将数据传递到charget.detect()

for csv in filecsv_list:

    with open(csv,'rb') as f:
        data = f.read()  # or a chunk, f.read(1000000)
    encoding=chardet.detect(data).get("encoding")
    print(encoding)

    b=pd.read_csv(csv,encoding=encoding,header=None,sep=',',engine='python')

答案 1 :(得分:1)

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:/ChromeDevSession" 显然猜错了。尝试给它提供一个示例,从中可以看出文件与ASCII实际不同的地方(显然在文件的后面)。但请注意,chardet不能总是总是正确地猜测。如果需要正确处理样本,则确实需要知道其编码。

答案 2 :(得分:0)

现在有替代chardet的方法。也许值得一看。

https://github.com/Ousret/charset_normalizer

from charset_normalizer import detect
for csv in filecsv_list:

    with open(csv,'rb') as f:
        data = f.read()  # or a chunk, f.read(1000000)
    encoding=chardet.detect(data).get("encoding")
    print(encoding)

    b=pd.read_csv(csv,encoding=encoding,header=None,sep=',',engine='python')

另一个是cchardet,但它与cpp uchardet绑定。仍然有希望。