使用python或R重命名目录中的文件

时间:2015-08-30 16:40:46

标签: r python-3.x

我遇到过使用python重命名目录中文件的类似问题。

我将这些文件放在要重命名的目录中:

    -statistical_analysis_with_r
    -statistical_pattern_recognition_3rd_edition

    -Statistical Analysis With R
    -Statistical Pattern Recognition 3rd Edition

为此,我在windows中编写了这个脚本:

def naming(so):
    import re
    w=re.split('[ _]+',so)
    r=[]
    for i in w:
        r.append(i.capitalize())
    print(' '.join(r))  



import os
for c in os.listdir(os.getcwd()):
    if c.endswith(".pdf"):
        os.rename(c,naming(c))
print(os.listdir(os.getcwd()))

但是我收到了这个错误:

Statistical Analysis With R.pdf
Traceback (most recent call last):

  File "<ipython-input-79-d7f645d6d3e5>", line 4, in <module>
    os.rename(c,naming(c))

TypeError: rename: can't specify None for path argument

任何人都可以帮助你做些什么吗?

And any help doing same thing using R (www.r-project.org)?

提前感谢。

3 个答案:

答案 0 :(得分:2)

您的naming函数未返回名称,它会输出名称并返回None。这就是为什么你收到关于None的错误。

更改此内容:print(' '.join(r))

对此:return ' '.join(r)

答案 1 :(得分:1)

你正在混淆你的语言。在R中,函数将返回引用的最后一个东西,但在Python中你必须明确地说&#34; return&#39; &#39;。加入(R)&#34 ;.或者也许你正在混淆&#34; print&#34;并且&#34;返回&#34;。无论哪种方式,您都不会在命名()函数中显式返回任何内容,因此您将获得None对象。

至于你的命名()函数,你可以这样做:

>>> foo = "foo_bar_foobar"
>>> foo.replace('_', ' ').title() # Your whole naming() function, in one line!
'Foo Bar Foobar'

这是更多&#34; Pythonic&#34;因为它使用字符串类提供的内置函数。由于该代码经过全部测试和广泛验证(由其他所有Python程序员完成),因此当您遇到错误时,它可以更加自信,它不在replace()或title()函数中。这是Python等语言的最大好处之一。当您重新发明轮子时,您必须在新轮子上进行所有自己的测试和调试。 Python,Ruby等语言为您提供非常可靠的轮子。

答案 2 :(得分:1)

一个R解决方案,

  1. here中为大写(标题样式)块写一个小实用程序函数

    simpleCap <- function(x) { s <- strsplit(x, " ")[[1]] paste(toupper(substring(s, 1,1)), substring(s, 2), sep="", collapse=" ") }

  2. 阅读感兴趣的文件(为了便于阅读)

    files <- dir(pattern = ".pdf$") #".pdf$" as an example

  3. 3A。很好,使用(管道)“%&gt;%”运算符

    library(dplyr)
    
    files %>% 
    gsub("_", " ", .) %>% 
    lapply(simpleCap) %>% 
    unlist %>% 
    file.rename(from = files, to = .)
    

    3B。或者是一个不太好的版本,没有'管道'

    file.rename(from = files, to = unlist(lapply(gsub("_", " ", files), simpleCap))