Windows环境GitHub Action重命名日文文件名报找不到文件错误求解
问题诱因
- 核心错误是多余的文件名转码操作:Python 3 中
os.listdir()在Windows环境下会直接返回和系统文件API匹配的Unicode格式文件名字符串,不需要额外做编码转换。代码中对拿到的文件名执行filename.encode('utf-8').decode(locale.getpreferredencoding(False))属于错误转码,会导致字符串实际内容和磁盘存储的文件名不匹配。 - 日志中print能正常显示日文文件名,是因为日志输出流的编码刚好适配转码后的字符串,属于肉眼可见的匹配,不代表字符串能被系统文件API正确识别。
- 最开始直接用硬编码日文路径调用
pd.read_csv()失败,也是同样的原因:脚本中硬编码的UTF-8格式日文字符串,和Windows runner默认非UTF-8区域设置下的文件系统文件名编码不匹配,导致路径查找失败。 - 额外注意:贴出的重命名代码中
os.rename()调用缺少一个闭合右括号,如果实际运行代码存在该问题会先触发语法错误,当前抛出文件找不到错误说明该问题是粘贴代码时的笔误。
可行解决方案
- 移除所有手动文件名转码逻辑,直接使用
os.listdir()返回的原始文件名做路径拼接,Python的os模块会自动完成和Windows系统API的路径适配,不需要手动处理编码。 - 优先采用遍历匹配后直接读取的方案,不需要重命名文件,避免额外操作风险,参考代码:
import os import pandas as pd download_path = "C:\\" df = None for filename in os.listdir(download_path): if filename.startswith("202204"): file_path = os.path.join(download_path, filename) # 注意如果csv内容本身是日文编码,需要指定encoding参数,比如shift-jis/cp932/utf-8 df = pd.read_csv(file_path, encoding="utf-8") break
- 如果确实需要重命名文件,修正后的重命名逻辑如下:
import os download_path = "C:\\" for filename in os.listdir(download_path): if filename.startswith("202204"): old_path = os.path.join(download_path, filename) new_path = os.path.join(download_path, "202204.csv") os.rename(old_path, new_path) print(f"file renamed to {new_path}") break
- 若上述方案仍存在编码兼容问题,可在GitHub Action的Windows环境步骤中提前执行PowerShell命令开启全局UTF-8支持,再运行Python脚本:
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage" -Name "ACP" -Value "65001" Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage" -Name "OEMCP" -Value "65001"
内容的提问来源于stack exchange,提问作者KowComical
相关产品推荐
相关产品推荐

