Python中关于读取文件时的编码问题如何处理?

今天在一个镜像机上安装 python3

安完之后测试的时候一直报不能用 ascii 解码的错误

然后 sys.getfilesystemencoding()的结果是 ascii

问下这个跟机器的编码有关么。也没找到怎么修改
Python中关于读取文件时的编码问题如何处理?

11 回复

说了半天,上代码和文件的内容啊?

试试:
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')

核心要点:

  1. 总是明确指定编码:不要依赖系统默认编码,用encoding='utf-8'这样的参数
  2. 优先使用UTF-8:这是现代应用的标准编码
  3. 处理异常情况:用try-except捕获UnicodeDecodeError
  4. 考虑使用chardet:当不确定文件编码时,这个库能自动检测
  5. 注意BOM标记:Windows文件可能有BOM,用utf-8-sig处理

简单建议:明确指定编码并准备好备选方案。

读取的时候加上编码类型不就行了。

文件相关用 codecs 库,不要直接 open

用的是 logging .config.configfile()打开的一个配置文件 文件保存的是 asciiascii filefile 命令查看是 isoiso 那个类型 这个函数又不能指定编码 所以很纠结

是 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)

好的 学习了 多谢大佬

回到顶部