【问题标题】:Replace part of filename if it's found in a list (Python)如果在列表中找到文件名,则替换部分文件名(Python)
【发布时间】:2020-07-26 18:52:15
【问题描述】:

我有一段代码,其中大部分是从这里的另一个问题中得到的。在做了一些调整之后,它似乎不起作用。 目的很简单:我有一个包含许多文件的目录,所有文件都包含垃圾词/字符,需要用不同的东西替换。

我有 2 个包含这些词的列表。代码如下所示:

import os, string
rootdir = r'C:\Users\me\Downloads\Documents\Folder'
lst = ["this that", "This.that", "THIS.THAT", "this_that", "This.That"]
lst2 = ["_","__","___","."]
for filename in os.listdir(rootdir):
    if any(i in filename for i in lst):
        filepath = os.path.join(rootdir, filename)
        newfilepath = os.path.join(rootdir, filename.replace(i, ""))
        os.rename(filepath, newfilepath)
    if any(i in filename for i in lst2):  
        filepath = os.path.join(rootdir, filename)
        newfilepath = os.path.join(rootdir, filename.replace(i, " "))
        os.rename(filepath, newfilepath)

但是当我运行它时,错误是NameError: name 'i' is not defined 不知道为什么会这样,我应该被定义为“出现在列表中的文件名的一部分”。至少我是这么认为的。尝试以不同的方式定义它,但没有成功。

任何想法如何解决这个问题?谢谢

【问题讨论】:

  • any(i in filename for i in lst): 中的 i 仅在该生成器内具有作用域
  • filename.replace(i, "")) this i 不可用/声明为 i in any() is not available outside

标签: python list any


【解决方案1】:

正如 han solo 和 Vaibhav 所指出的,变量 i 仅在 for 循环的范围内退出。由于您使用单行 for 循环,因此在其余代码中无法访问该变量。我建议像这样使用多行 for 循环:

import os, string
rootdir = r'C:\Users\me\Downloads\Documents\Folder'
lst = ["this that", "This.that", "THIS.THAT", "this_that", "This.That"]
lst2 = ["_","__","___","."]
for filename in os.listdir(rootdir):
    for i in lst:
        if i in filename:
            filepath = os.path.join(rootdir, filename)
            newfilepath = os.path.join(rootdir, filename.replace(i, ""))
            os.rename(filepath, newfilepath)
            #No need to loop through other possibilities if we've found a match
            break
    for i in lst2:
        if i in filename:
            filepath = os.path.join(rootdir, filename)
            newfilepath = os.path.join(rootdir, filename.replace(i, " "))
            os.rename(filepath, newfilepath)
            break

看起来不那么漂亮,但应该可以!

另外,我是否建议根据小写文件名字符串检查您的列表,以免意外跳过字符串中某处带有大写字符的文件名?如果您不想让搜索区分大小写,这可能是个好主意!这是一个建议代码:

import os, string
rootdir = r'C:\Users\me\Downloads\Documents\Folder'
lst = ["this that", "This.that", "THIS.THAT", "this_that", "This.That"]
lst2 = ["_","__","___","."]
for filename in os.listdir(rootdir):
    for i in lst:
        if i.lower() in filename.lower():
            filepath = os.path.join(rootdir, filename)
            newfilepath = os.path.join(rootdir, filename.replace(i, ""))
            os.rename(filepath, newfilepath)
            #No need to loop through other possibilities if we've found a match
            break
    for i in lst2:
        if i.lower() in filename.lower():
            filepath = os.path.join(rootdir, filename)
            newfilepath = os.path.join(rootdir, filename.replace(i, " "))
            os.rename(filepath, newfilepath)
            break

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多