【问题标题】:Replacing Filename characters with python用python替换文件名字符
【发布时间】:2011-08-23 12:13:41
【问题描述】:

我有一些代码将单词“_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)

【问题讨论】:

  • 现有脚本有什么问题???
  • 我的意思是 ES 对不起!脚本没有问题 - 但我需要将文件名中当前的 ES 替换为它!抱歉,如果这令人困惑!
  • 你应该可以自己得到这个,所以这里有一个提示。使用python的slice notation
  • @Alice Duff 我发现你现在的代码很重:你不需要定义对象 fullpathfilename_splitfilename_zerofileext:它破坏了可读性
  • 对可读性感到抱歉!我太害怕删除任何内容以防万一出现问题..

标签: python replace filenames


【解决方案1】:

试试这个:

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' 结尾的文件名。如果您只想更改这些文件名,这是正确的。我的代码更通用,它在扩展前的最后两个字母处更改所有文件名。它可能不是你想要的,所以你可以投票 hughdbrown。但是您也可以考虑在我的代码中添加一个条件来选择要更改的文件名,因此我的代码更加通用和适应性强。你必须考虑和选择。
【解决方案2】:

对于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。快速的菜鸟问题,但路径 = (...) 是什么?它在做什么?我知道是某种迭代命令,但我仍然很困惑。它叫什么,你能指出一些解释它的东西吗?
【解决方案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 来分块延迟打印,这样一般的执行速度会更快
【解决方案4】:

你可以这样做:

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:是的,该语句将采用文件名字符串并替换每次出现的“ES.txt”并将其替换为“ES_manual.txt”。这是处理您描述的内容的最基本方法。如果您需要更复杂的东西,请告诉我们您到底想要什么:)
  • 嗯..我试过了,一切都保持不变!
  • @Alice Duff:我编辑了我的第一个答案以在您的代码中显示我的陈述。语句print 是否显示预期值?
  • 你的意思是:filename = filename.replace("ES.txt","ES_manual.txt") 你提供的版本没有副作用,正如 Alice 的测试所显示的那样。
【解决方案5】:

这是不使用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)

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 1970-01-01
    • 2017-10-19
    • 2021-12-22
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2017-01-21
    • 2013-02-11
    相关资源
    最近更新 更多