【问题标题】:Can't rename files in R because of french accent由于法语口音,无法在 R 中重命名文件
【发布时间】:2022-01-13 15:32:42
【问题描述】:

这可能是重复的,但我在其他帖子上没有找到答案,所以我会在这里发布。我在重命名带有重音符号(法语)的文件时遇到问题。我的目标是删除所有文件中的所有重音,然后用适当的名称重命名它们。我认为问题来自file.list()。例如,当我列出一个名为“désolé”的文件时,它将被列为“de´sole´”。但令人惊讶的是,我仍然可以用 str_replace_all() 将“e´”替换为“é”。当我最终尝试重命名文件时,问题就来了。我什至无法访问该文件,因为我的路径未正确读取,因为我从文件列表中获取更改的名称,我无法选择文件,因此无法重命名它。这是代码:

library(stringr)

  Path <- "G:/qgis/Batiment_PDF_MACRO/Batiments_Communaux/Bex/"

  list <- list.files(path=Path)
  
for (i in 1:length(list)) {
  pattern <- c("é", "è", "ê", "ë", "à", "â", "ä", "î", "ï", "ö", "ô", "û", "ü", "ù", "ç")
  if (str_contains(list[i], pattern, logic = "OR") == TRUE) {
      filename <- paste0(Path, list[i])
      name <- str_replace_all(list[i], "é", "e")
      name <- str_replace_all(name, "è", "e")
      name <- str_replace_all(name, "ê", "e")
      name <- str_replace_all(name, "ë", "e")
      name <- str_replace_all(name, "à", "a")
      name <- str_replace_all(name, "â", "a")
      name <- str_replace_all(name, "ä", "a")
      name <- str_replace_all(name, "ï", "i")
      name <- str_replace_all(name, "î", "i")
      name <- str_replace_all(name, "ö", "o")
      name <- str_replace_all(name, "ô", "o")
      name <- str_replace_all(name, "û", "u")
      name <- str_replace_all(name, "ü", "u")
      name <- str_replace_all(name, "ù", "u")
      name <- str_replace_all(name, "ç", "c")
      
      newfilename <-paste0(Path, name)
    file.rename(filename, newfilename)
    
  }
} 

我试图改变编码和东西,但没有成功......

[编辑] 实际上我认为我的文件夹名称是用奇怪的字符写的,或者我不知道。例如,我刚刚注意到某些字母(例如“â”)没有被替换,我尝试了所有这些:

name <- str_replace_all(name, "â", "a")
name <- str_replace_all(name, "a^", "a")
name <- str_replace_all(name, "^", "")

但没有任何工作,但如果我设置自己

name <- "château"

这里的输出是成功的“城堡”,这意味着我的文件夹名称有点奇怪。该文件夹也是使用 R 使用 dir.create() 函数创建的,名称来自最初在苹果计算机 (mac) 中命名的图片名称,我拥有一台 pc,也许问题来自那里?

[EDIT OF EDIT] 我在这个网站 (https://unicodelookup.com/) 上查看了我的文件夹名称由哪些实际字符组成,这很奇怪。如果你或我在这个网站上输入“é”,你会得到这个:“é:拉丁小写字母 e,带有锐音” 但是当我从我的文件夹中复制粘贴“é”时,会发生这种情况:“e:拉丁小写字母 e”+“´:组合重音”。这意味着我的文件夹名称中的 é 与正常的 é 不同,list.files() 函数可能会将这些奇怪的 é 转换为正常的 é,因此我再也找不到正确的路径了。

【问题讨论】:

  • 也许你可以用 unicode 替换字符串。例如,“é”在 unicode 中写为“\u00e9”。你可以在这里找到其他的compart.com/fr/unicode/U+00E9
  • @但是问题不是出在替换上,而是找到原来的路径名。似乎 list.files() 在重命名文件时没有给出 R 想要的确切文件名......

标签: r encoding rename french


【解决方案1】:

对于字符串转换问题,您可以简单地使用:

newfilename <- iconv(str, to = 'ASCII//TRANSLIT')

对于重命名,正如@defuneste 指出的那样,您添加了两次路径,而不是您应该这样做:

file.rename(file.path(Path, iconv(my_list[i], to = 'ASCII//TRANSLIT'))

【讨论】:

  • 哦,我想用iconv功能,但是当我想下载包时,它说它在另一个版本的R中。我不知道它现在在R中
  • 而且刚刚测试了一下,居然不行,é变成了e?并且 变成 a^
  • 没有看到你编辑,无论如何我都会收到这个错误消息:警告消息:在 file.rename(file.path(list[i]), iconv(list[i] , to = "ASCII//TRANSLIT")) : 无法将文件 'G:/qgis/Batiment_PDF_MACRO/Batiments_Communaux/Bex/Bex Chemin Pre´-de-la-Cible 4' 重命名为 'G:/qgis/Batiment_PDF_MACRO/Batiments_Communaux/ Bex/Bex Chemin Pre?-de-la-Cible 4',原因'系统找不到指定的文件'
  • 奇怪,刚刚测试了从这个页面复制你的â:iconv("â", to = 'ASCII//TRANSLIT') --> "a"
  • yep normal bc 这是一个正常的 â,试试这个“â”,它会输出 a^
【解决方案2】:

我认为您需要添加路径,如下所示。

library(stringr)

#dummy data
Path <- "test/"
dir.create("test")
file.create("test/désolé")
file.create("test/purée")

# I dont like naming an object with a function name 
# You need the path or it failed see full.names
my_list <- list.files(path = Path, full.names = T) 

# here we go !
for (i in 1:length(my_list)) {
str_replace_all(my_list[i], "é", "e")
file.rename(my_list[i], str_replace_all(my_list[i], "é", "e"))
}

list.files("test/")

在这里,我使用了第二个版本 @karl-forner iconv() 并尝试使用您的路径的一部分。它有效,但似乎我们无法重现您的麻烦...

Path <- "test/"
dir.create("test")
file.create("test/désolé")
file.create("test/purée")
file.create("test/Bex Chemin Pre´-de-la-Cible 4")


# I dont like namking an object with a function name 
# You need the path or it failed see full.names
my_list <- list.files(path = Path, full.names = T) 
my_list

# here we go !
for (i in 1:length(my_list)) {

file.rename(my_list[i], iconv(my_list[i], to = 'ASCII//TRANSLIT'))
}

list.files("test/")


【讨论】:

  • 这个不行,还是一样的问题,找不到路径
  • 你能测试我的代码吗?您可能需要稍微调整一下以适应您的操作系统(即更改/改为)。如果我的代码有效,我们可以在您的问题上有所进展。
  • 我的糟糕,这实际上适用于您的“虚拟数据”,但我的文件名似乎很奇怪,请参阅我的编辑了解更多信息
  • 我没有一个好的解决方案....你能试试iconv("château", toRaw = TRUE)吗?我的猜测是你有多种编码......
  • 它输出我这个:63 68 e2 74 65 61 75,有点奇怪
猜你喜欢
  • 1970-01-01
  • 2021-02-26
  • 2013-08-31
  • 2019-06-03
  • 2011-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 2014-07-03
相关资源
最近更新 更多