在R中重命名文件

3

我有从R重命名文件的问题。

我的桌面文件夹中有10个文件:

račun 1.xlsx

račun 2.xlsx

...

račun 10.xlsx

我尝试了以下方法:

files <- list.files(path = "myfolder")
file.rename(files,
        paste0("novi_", 1:10, ".xlsx"))

这是我得到的结果:
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

我想这是由于Unicode字符č导致的,但我不知道如何找到解决方案。


2
顺便提一下:使用paste0("novi_", seq_along(files), ".xlsx")可能更安全... - r2evans
你是否收到任何警告,或者只是逻辑向量返回。file.exists("račun 1.xlsx")的输出是什么? - De Novo
R版本3.4.2(2017-09-28) 平台:x86_64-w64-mingw32 / x64(64位) 运行于:Windows >= 8 x64(build 9200)矩阵乘积:默认语言环境: [1] LC_COLLATE = English_United States.1252 [2] LC_CTYPE = English_United States.1252 [3] LC_MONETARY = English_United States.1252 - Luka
我在下面的问题编辑中提出了另一个建议。希望我的建议能帮助您诊断问题,但看起来我并没有完全帮您解决问题。 - De Novo
2
我已经在控制面板中更改了我的区域设置,将格式设置为塞尔维亚语(拉丁字母,塞尔维亚),现在它可以正常工作了。非常感谢。 - Luka
显示剩余5条评论
2个回答

3

编辑2:本文解决方案是让OP在控制面板中更改区域设置,将格式设置为塞尔维亚语(拉丁字母,塞尔维亚)。

编辑1:请注意评论:OP正在使用Windows机器。 问题在于list.files()(以及可能的dir(),因为它们调用相同的.Internal)正在将非ASCII文件名转换为ASCII,但Windows希望file.exists()发送给它Unicode文件名,(并且可能还有file.rename()

尝试:

file.rename(gsub("c", "č", files), paste0("novi_", seq_along(files, ".xlsx"))
# could work, but it didn't for `file.exists()`

原始回答:

setwd(<your path>)
(files <- list.files())
# [1] "račun 1.xlsx" "račun 2.xlsx" "račun 3.xlsx" "račun 4.xlsx" "račun 5.xlsx [6] "račun 6.xlsx"    
file.rename(files, paste0("novi_", seq_along(files, ".xlsx"))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE

你在list.files()中指定了路径,这表明你不在正确的目录中。


仍然是同样的结果。 - Luka
@Luka 这在我的机器上可以运行。file.rename()“受制于操作系统相应的系统调用的限制。”你能在你的shell中做到这一点吗? - De Novo
Windows可以完美地处理非ASCII文件名。但是Windows版本的R有时会出现问题。 - Hong Ooi
是的,这是明显的问题。list.files()返回ASCII文件名,但当它们传递给file.exists()时,Windows期望非ASCII文件名。 - De Novo

0

避免这种问题的一种方法是使用文件名的8.3版本,这可以保证只有ASCII字符。主要问题是(就我所知)在R中无法以编程方式获取此信息,因此您应该仔细检查是否正确:

files <- paste0("RAUN~", 1:10, ".XLS")
newfiles <- paste0("novi_", 1:10, ".xlsx")
file.rename(files, newfiles)

你可以通过命令行使用DIR /X来获取8.3格式的文件名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接