使用R/Reticulate读取含阿拉伯语(波斯语)文件名的文件遇阻
解决含波斯语文件名的Excel文件读取问题(R/Reticulate)
一、Reticulate调用Python直接读取文件名的解决方案
问题根源
Windows环境下,RStudio控制台编码与CMD存在差异,导致R传递给Python的波斯语文件名编码未被正确识别,从而触发"文件找不到"错误。
具体解决步骤
- 确认工作目录一致性
先检查R和Python的工作目录是否一致,避免因路径不同导致文件找不到:
library(reticulate) # 查看R的工作目录 getwd() # 查看Python的工作目录 py_run_string("import os; print(os.getcwd())")
若不一致,用setwd()或py$os$chdir()统一工作目录。
- 转码文件名适配系统编码
Windows对波斯语文件名通常使用CP1256编码,将R中的UTF-8文件名转码后传递给Python:
file_name <- "توزیع نقدی 1401.xls" # 转码为CP1256编码 file_name_cp1256 <- iconv(file_name, from = "UTF-8", to = "CP1256") # 验证文件是否存在 py$os$path$exists(file_name_cp1256) # 读取文件并传回R py_run_string(paste0("import pandas as pd; df = pd.read_excel('", file_name_cp1256, "')")) df <- py$df
- 使用Python路径模块自动处理编码
让Python负责文件名的编码识别,避免手动转码:
library(reticulate) py_run_string("import os, pandas as pd") file_name <- "توزیع نقدی 1401.xls" # 构造绝对路径确保识别 abs_path <- py$os$path$abspath(file_name) # 直接读取文件 df <- py$pd$read_excel(abs_path)
二、R直接读取含波斯语文件名的Excel文件方法
方法1:转码文件名后使用readxl/openxlsx
library(readxl) file_name <- "توزیع نقدی 1401.xls" # 转码为CP1256编码 file_name_conv <- iconv(file_name, from = "UTF-8", to = "CP1256") # 读取xls文件 df <- read_excel(file_name_conv)
若使用openxlsx包(仅支持xlsx格式):
library(openxlsx) df <- read.xlsx(file_name_conv)
方法2:通过list.files()索引读取
利用R的list.files()获取系统识别的文件名,再匹配读取:
# 获取目录下所有xls/xlsx文件(含完整路径) file_list <- list.files(pattern = "\\.xls(x)?$", full.names = TRUE) # 匹配目标波斯语文件名 target_file <- file_list[grepl("توزیع نقدی", file_list)] df <- read_excel(target_file)
方法3:调整系统区域设置(可选)
进入Windows控制面板「区域」→「管理」→「更改系统区域设置」,勾选「Beta版:使用Unicode UTF-8提供全球语言支持」,重启系统后可直接读取UTF-8编码的非ASCII文件名(注意:该设置可能影响部分旧程序兼容性)。
内容的提问来源于stack exchange,提问作者Mohamed Mostafa El-Sayyad
相关产品推荐
相关产品推荐

