乱码由来

相信大家使用Python读取txt、csv文件时,经常遇到UnicodeDecodeError错误,从字面意思看是 编码解码问题 。 关于编码解码相关知识推荐看B站柴知道制作的视频,了解

**锟斤拷�⊠是怎样炼成的——中文显示"⼊"门指南【**柴知道】


遇到乱码

在Python中,遇到文件读取乱码的可能性很大,例如

import pandas as pd

df = pd.read_csv('twitter_sentiment.csv')
df.head()

Run

c:\users\thunderhit\appdata\local\programs\python\python37-32\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
...

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._tokenize_rows()

pandas\_libs\parsers.pyx in pandas._libs.parsers.raise_parser_error()

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 10717: illegal multibyte sequence

可以看到报错, 遇到 UnicodeDecodeError 问题


使用encoding参数

常见的解决办法是在函数内加入encoding参数,中文最常见的编码方式有gbk、gb2312、utf-8。

import pandas as pd

#这里依次试验gbk、gb2312、utf-8
df = pd.read_csv('twitter_sentiment.csv', encoding='utf-8')
df.head()

依然出现 UnicodeDecodeError 问题 。所以encoding遇到很不常见的编码方式。


获取encoding参数

先获取 twitter_sentiment.csv 文件的编码方式,再进行读取操作。

import chardet

#读取为二进制数据
binary_data = open('twitter_sentiment.csv', 'rb').read()

#传给chardet.detect,稍等片刻
chardet.detect(binary_data)

Run

{'encoding': 'Windows-1252', 'confidence': 0.7291192008535122, 'language': ''}

由此得知该文件的编码方式为 Windows-1252 , 重新更改即可成功读入数据


成功读取

获取了正确的编码 encoding='Windows-1252', 就能正确的读入数据

import pandas as pd

#这里依次试验gbk、gb2312、utf-8
df = pd.read_csv('twitter_sentiment.csv', encoding='Windows-1252')
df.head()

Run

ItemID Sentiment SentimentText
0 1 0 is so sad for my APL frie...
1 2 0 I missed the New Moon trail...
2 3 1 omg its already 7:30 :O
3 4 0 .. Omgaga. Im sooo im gunna CRy. I'...
4 5 0 i think mi bf is cheating on me!!! ...

广而告之