使用Python替换文件名中的字符

9
我有一些代码,可以在文件名的末尾添加单词"_manual"。 我需要更改脚本,以便删除文件名的最后两个字母(ES),然后将它替换为"_ES_Manual"。 例如:AC-5400ES.txt --> AC-5400_ES_manual.txt
如何将该函数整合到此代码中?
folder = r"C:/Documents and Settings/DuffA/Bureaublad/test"
import os # glob is unnecessary
for root, dirs, filenames in os.walk(folder):
    for filename in filenames:
        fullpath = os.path.join(root, filename)
        filename_split = os.path.splitext(fullpath) # filename and extensionname (extension in [1])
        filename_zero, fileext = filename_split
        print fullpath, filename_zero + "_manual" + fileext
        os.rename(fullpath, filename_zero + "_manual" + fileext)

现有脚本存在什么问题? - rocksportrocker
1
你应该能够自己解决这个问题,这里给你一个提示。使用Python的切片符号 - Chris Pickett
1
@Alice Duff 我觉得你现在的代码有些冗长:你不需要定义 fullpathfilename_splitfilename_zerofileext 这些对象,这会影响代码的可读性。 - eyquem
抱歉阅读性不好!我太害怕删除任何东西,以防出错。 - Alice Duff
好的,谢谢。下次我会确保这样做!一旦我更加理解这些东西,我相信我会变得不那么害羞,敢于删除东西! - Alice Duff
显示剩余2条评论
5个回答

21

试试这个:

import os
pathiter = (os.path.join(root, filename)
    for root, _, filenames in os.walk(folder)
    for filename in filenames
)
for path in pathiter:
    newname =  path.replace('ES.txt', '_ES_manual.txt')
    if newname != path:
        os.rename(path,newname)

@Alice Duff hughdbrown 的代码仅适用于以“ES.txt”结尾的文件名。如果您只想更改这些文件名,则此代码是正确的。我的代码更通用,它会更改扩展名前的所有文件名的最后2个字母。可能会发生这种情况,这不是您想要的,因此您可以为_hughdbrown_投票。但是您也可以考虑在我的代码中添加条件以选择要更改的文件名,因此我的代码更通用和可适应。您必须考虑并选择。 - eyquem

8

针对hughdbrown的回答,这段代码可以用来删除任何特定的字符或一组字符。

import os

paths = (os.path.join(root, filename)
        for root, _, filenames in os.walk('C:\FolderName')
        for filename in filenames)

for path in paths:
    # the '#' in the example below will be replaced by the '-' in the filenames in the directory
    newname = path.replace('#', '-')
    if newname != path:
        os.rename(path, newname)

谢谢@nicholas。快速的新手问题,paths = (...)是什么?它在做什么?我知道它是一种迭代命令,但我仍然感到困惑。它叫什么名字,你能指点我一些解释吗? - dodohjk

3

您可以这样做:

for filename in filenames:
    print(filename) #should display AC-5400ES.txt
    filename = filename.replace("ES.txt","ES_manual.txt")
    print(filename) #should display AC-5400ES_manual.txt
    fullpath = os.path.join(root, filename)
    os.rename(fullpath, filename)

但我需要保留文件名的开头部分“AC-5400ES” - 这对此有用吗? - Alice Duff
@Alice Duff:是的,这个语句将获取文件名字符串并替换每个出现的“ES.txt”,将其替换为“ES_manual.txt”。这是处理您所描述的情况最基本的方法。如果您需要更复杂的东西,请告诉我们您确切想要什么 :) - JMax
嗯...我尝试了这个,但一切都完全没有改变! - Alice Duff
@Alice Duff:我编辑了第一个答案,以便在你的代码中显示我的语句。这些“print”语句是否显示了预期值? - JMax
你的意思是这样的:filename = filename.replace("ES.txt","ES_manual.txt") 你提供的版本没有任何副作用,正如Alice的测试所显示的那样。 - hughdbrown
显示剩余2条评论

3
for root, dirs, filenames in os.walk(folder):
    to_write = ['root == %s\n' % root]

    for filename in filenames:
        filename_zero, fileext = os.path.splitext(filename)
        newname = "%s_%s_manual%s" % (filename_zero[:-2],filename_zero[-2:],fileext)

        tu = (os.path.join(root, filename), os.path.join(root, newname))

        to_write.append('%s --> %s\n' % tu)
        os.rename(*tu)

    print '\n'.join(to_write)

@Alice Duff 它正在迷人地滑动!顺便说一下,我使用对象 to_write 来延迟分块打印,以使总体执行更快。 - eyquem

0

这里有另一种不使用os.path.joinos.walk的替代方案:

import os

fileLocation = "C:\\Documents and Settings\\DuffA\\Bureaublad\\test\\"
fileList = os.listdir(fileLocation)

for ii in fileList:
    newName = ii.replace('ES','_ES_Manual')
    if newName != ii:
        os.rename(fileLocation+ii,fileLocation+newName)

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