Mac系统下Python通过别名打开文件遇UnicodeDecodeError问题求助
解决Mac别名导致Python读取文件UnicodeDecodeError的问题
这个问题的核心原因是:Mac上的别名(Alias)并不是POSIX标准的符号链接,它本质上是一个包含元数据的小型二进制文件,而非直接指向目标文件的指针。你的Python脚本用open('verbs.txt')打开的其实是这个别名文件本身,而不是它指向的真实文本文件,所以读取到的是二进制内容,自然会触发UTF-8解码错误。
下面给你两种可行的解决方法:
方法1:用AppleScript解析别名获取真实路径
你可以通过Python调用AppleScript来解析别名对应的真实文件路径,修改后的代码如下:
#! /usr/bin/env python3 # -*- coding: utf-8 -*- import sys import os import re import subprocess def resolve_mac_alias(alias_path): # 调用AppleScript解析别名 script = f''' set aliasFile to POSIX file "{alias_path}" as alias set targetPath to POSIX path of (original item of aliasFile) return targetPath ''' result = subprocess.run(['osascript', '-e', script], capture_output=True, text=True) if result.returncode == 0: return result.stdout.strip() else: raise Exception(f"Failed to resolve alias: {result.stderr}") parsePattern = re.compile( '(.+);(.+)' ) verbsSpanish = [] verbsEnglish = [] factor = 1 # 先处理别名,获取真实文件路径 alias_path = 'verbs.txt' if os.path.exists(alias_path): try: real_file_path = resolve_mac_alias(alias_path) except Exception: # 如果不是别名,直接用原路径 real_file_path = alias_path else: print(f"File {alias_path} does not exist") sys.exit(1) # 打开真实文件 with open(real_file_path, 'r', encoding='utf-8') as verbFile: for line in verbFile: match = parsePattern.search( line ) if match: for i in range(factor): verbsSpanish.append( match.group( 1 ) ) verbsEnglish.append( match.group( 2 ) ) else: print( line + '\n') print( 'Success' ) sys.exit()
这个方法通过AppleScript的original item命令获取别名指向的真实文件路径,保证Python打开的是正确的文本文件。
方法2:将别名替换为POSIX符号链接
如果你不想修改代码,可以直接把Mac别名换成符号链接:
- 删除现有的
verbs.txt别名 - 打开终端,切换到别名所在的目录,执行命令:
ln -s /path/to/real/verbs.txt ./verbs.txt
这里的/path/to/real/verbs.txt要替换成你真实的verbs.txt文件路径。
符号链接是POSIX标准的文件系统对象,Python的open()函数会自动跟随符号链接打开目标文件,这样你的原代码不需要任何修改就能正常运行。
为什么用副本没问题?因为副本是真实的文本文件,完全复制了原文件的内容,而别名是一个二进制的“快捷方式文件”,两者的内容完全不同,所以直接打开别名会读取到非UTF-8的二进制数据,导致解码错误。
内容的提问来源于stack exchange,提问作者jayboh
相关产品推荐
相关产品推荐

