Python中关于读取文件时的编码问题如何处理?
今天在一个镜像机上安装 python3
安完之后测试的时候一直报不能用 ascii 解码的错误
然后 sys.getfilesystemencoding()的结果是 ascii
问下这个跟机器的编码有关么。也没找到怎么修改
Python中关于读取文件时的编码问题如何处理?
说了半天,上代码和文件的内容啊?
试试:
f = open(r’yourFilePath’, encoding=‘某某编码’)
如果报 某某编码 can’t decde at xx position…
说明文件就不是那个编码。更准确的说,文件中可能使用了其它的编码的字符或符号。
最好的办法,就是用二进制查看工具看下。对于 ASCII,看下是否有超过 127(也就是 16 进制:EF)的,如果有,说明就不是纯 ASCII。
我猜测是这种可能性比较大。
或者文件给我发一份。
# 处理文件编码问题的标准做法
import codecs
# 1. 明确指定编码(推荐)
try:
# 使用with语句自动管理资源
with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()
except UnicodeDecodeError:
# 如果utf-8失败,尝试其他编码
try:
with open('file.txt', 'r', encoding='gbk') as f:
content = f.read()
except UnicodeDecodeError:
# 继续尝试其他编码或使用错误处理
pass
# 2. 使用chardet自动检测编码(需要安装:pip install chardet)
import chardet
def read_file_with_detection(filepath):
# 先以二进制模式读取部分内容来检测编码
with open(filepath, 'rb') as f:
raw_data = f.read(10000) # 读取前10000字节用于检测
result = chardet.detect(raw_data)
encoding = result['encoding']
confidence = result['confidence']
if confidence < 0.8: # 置信度太低时使用备选方案
encoding = 'utf-8'
# 用检测到的编码重新读取文件
with open(filepath, 'r', encoding=encoding, errors='replace') as f:
return f.read()
# 3. 使用errors参数处理解码错误
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f:
# errors='ignore' 忽略无法解码的字符
content = f.read()
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:
# errors='replace' 用�替换无法解码的字符
content = f.read()
# 4. 处理BOM(字节顺序标记)
def read_file_handle_bom(filepath):
# 先检测BOM
with open(filepath, 'rb') as f:
bom = f.read(4)
if bom.startswith(codecs.BOM_UTF8):
encoding = 'utf-8-sig'
elif bom.startswith((codecs.BOM_UTF16_BE, codecs.BOM_UTF16_LE)):
encoding = 'utf-16'
elif bom.startswith((codecs.BOM_UTF32_BE, codecs.BOM_UTF32_LE)):
encoding = 'utf-32'
else:
encoding = 'utf-8' # 默认
with open(filepath, 'r', encoding=encoding) as f:
return f.read()
# 5. 通用解决方案
def read_file_safely(filepath, fallback_encodings=None):
if fallback_encodings is None:
fallback_encodings = ['utf-8', 'gbk', 'latin-1', 'cp1252']
for encoding in fallback_encodings:
try:
with open(filepath, 'r', encoding=encoding) as f:
return f.read()
except UnicodeDecodeError:
continue
# 所有编码都失败,使用忽略错误的方式读取
with open(filepath, 'r', encoding='utf-8', errors='replace') as f:
return f.read()
# 使用示例
content = read_file_safely('your_file.txt')
核心要点:
- 总是明确指定编码:不要依赖系统默认编码,用
encoding='utf-8'这样的参数 - 优先使用UTF-8:这是现代应用的标准编码
- 处理异常情况:用try-except捕获
UnicodeDecodeError - 考虑使用chardet:当不确定文件编码时,这个库能自动检测
- 注意BOM标记:Windows文件可能有BOM,用
utf-8-sig处理
简单建议:明确指定编码并准备好备选方案。
读取的时候加上编码类型不就行了。
文件相关用 codecs 库,不要直接 open
是 logging 的那个打开配置文件的方法 我看了一下没有指定编码的参数
上代码和报错信息,要不然只能瞎猜。
感谢 果然还是文件不是纯 ascii 编码 重新转码就 ok 了
已经搞定了 就是因为文件不是纯 ascii 而是 iso-8859 但是还有一个问题 就是为啥是默认用 ASCII 去读取 怎么修改呢
logging.config.fileconfig() 是用 open() 方法来读取文件的,open() 默认使用的编码是 locale.getpreferredencoding(False) 返回的编码,这个编码是由运行环境的语言环境变量判断来的,可能是你机子的语言环境变量没设置好。
或者可以用正确的编码打开文件后,再传给 logging.config.fileconfig():
with open(‘filename’, encoding=‘utf-8’) as f:
logging.config.fileconfig(f)
好的 学习了 多谢大佬


