1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
| import chardet
import pandas as pd
def read_csv_pd(filename, sep=','):
# 1. 使用 'rb' 模式打开文件并读取前几行/字节进行编码检测
# chardet 有时可能不可靠,但常用于猜测编码
try:
with open(filename, 'rb') as f:
# 读取部分文件内容以提高检测速度
raw_data = f.read(4096)
encode = chardet.detect(raw_data)['encoding']
# 确保检测到的编码名称是小写字符串
if encode:
encode = encode.lower()
else:
print(f"未能检测到文件编码: {filename}")
return False
except Exception as e:
print(f"文件读取或编码检测失败: {e}")
return False
# 2. 尝试使用检测到的编码读取文件
try:
# **修复点 1:变量和编码名称统一使用字符串**
if encode in ['utf-8', 'ascii']: # chardet 有时可能返回 ascii
# 尝试最常见的 UTF-8
data = pd.read_csv(filename, encoding='utf-8', sep=sep)
elif 'gb' in encode:
# **修复点 2:简化中文编码处理逻辑**
# GB2312, GBK, GB18030 兼容性:从兼容性最好的 GB18030 开始尝试
try:
data = pd.read_csv(filename, encoding='gb18030', sep=sep)
except UnicodeDecodeError:
# 如果 GB18030 失败,尝试其他检测到的编码,例如原始的 'gbk'
data = pd.read_csv(filename, encoding='gbk', sep=sep)
elif encode == 'utf-8-sig':
data = pd.read_csv(filename, encoding='utf-8-sig', sep=sep)
elif encode == 'iso-8859-1':
# **修复点 3:修正编码名称和参数拼写**
data = pd.read_csv(filename, encoding='iso-8859-1', sep=sep)
else:
# 对于其他未知编码,直接用检测到的编码尝试读取
print(f"尝试使用检测到的未知编码: {encode}")
data = pd.read_csv(filename, encoding=encode, sep=sep)
except UnicodeDecodeError as e:
# **修复点 4:通用错误处理**
print(f"读取文件 {filename} 时发生编码错误: {e}")
# **解决方案:忽略错误**
try:
data = pd.read_csv(filename, encoding=encode, sep=sep, errors='ignore')
except Exception as final_e:
print(f"无法使用任何方式读取文件: {final_e}")
return False
except Exception as e:
print(f"读取文件时发生未知错误: {e}")
return False
return data
|