【问题标题】:find and replace within a filename在文件名中查找和替换
【发布时间】:2011-01-20 11:32:56
【问题描述】:

我正在运行一个脚本,如果文件名包含“.”,则会抛出错误。或其中的“+”,所以我正在尝试制作一个替换所有“。”的脚本用“_”替换“+”可以正常工作。但是替换“。”的问题。是如果我不拆分文件 - 那么我所有的文件都会被删除!所以我尝试拆分文件,但现在它说脚本已经运行但所有的“。”仍然存在!

这是我的脚本:

folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1"

import glob, os
for filename in glob.glob(os.path.join(folder, "*+*")):
   os.rename(filename, filename.replace('+','_'))

for root, dirs, filenames in os.walk(folder): # returms root, dirs, and files
    for filename in filenames:
        filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1])
        filename_zero = filename_split[0]
        extension = str.upper(filename_split[1])
        for filename_zero in glob.glob(os.path.join(filename_zero, "*.*")):
            os.rename(filename_zero, filename_zero.replace('.','_'))

提前谢谢你!

【问题讨论】:

    标签: python filenames replace


    【解决方案1】:

    我不明白你代码的逻辑。 我添加了打印语句:

    folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1"
    
    import glob, os
    for filename in glob.glob(os.path.join(folder, "*+*")):
        print "I rename '+' to '_' in\n"+filename
        os.rename(filename, filename.replace('+','_'))
    
    
    print '\n\n---- Now, there after, are the filenames in \n     '+folder
    
    
    for root, dirs, filenames in os.walk(folder): # returms root, dirs, and files
        for filename in filenames:
            print '\nfilename==',filename
            filename_split = os.path.splitext(filename) # filename and extension name (extension in [1])
            filename_zero = filename_split[0]
            extension = str.upper(filename_split[1])
            print 'filename_zero==',filename_zero
            print 'os.path.join(filename_zero, "*.*")==',os.path.join(filename_zero, "*.*")
            print 'glob.glob(os.path.join(filename_zero, "*.*"))==',glob.glob(os.path.join(filename_zero, "*.*"))
            for filename_zero in glob.glob(os.path.join(filename_zero, "*.*")):
                print '  filename_zero in glob.glob(os.path.join(filename_zero, "*.*")) ==',filename_zero
                os.rename(filename_zero, filename_zero.replace('.','_'))
    

    这是结果

    I rename '+' to '_' in
    C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\+po.rt.hos.txt
    I rename '+' to '_' in
    C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ar.am+is.doc
    I rename '+' to '_' in
    C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ath+os.html
    I rename '+' to '_' in
    C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\d'a.rtagn+an
    I rename '+' to '_' in
    C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\dum+as.doc
    I rename '+' to '_' in
    C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1\ki.kiouili.do+c
    
    
    ---- Now, there after, are the filenames in 
         C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1
    
    filename== ar.am_is.doc
    filename_zero== ar.am_is
    os.path.join(filename_zero, "*.*")== ar.am_is\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    
    filename== arctic.txt
    filename_zero== arctic
    os.path.join(filename_zero, "*.*")== arctic\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    
    filename== ath_os.html
    filename_zero== ath_os
    os.path.join(filename_zero, "*.*")== ath_os\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    
    filename== atla.ntic.html
    filename_zero== atla.ntic
    os.path.join(filename_zero, "*.*")== atla.ntic\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    
    filename== d'a.rtagn_an
    filename_zero== d'a
    os.path.join(filename_zero, "*.*")== d'a\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    
    filename== dum_as.doc
    filename_zero== dum_as
    os.path.join(filename_zero, "*.*")== dum_as\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    
    filename== ki.kiouili.do_c
    filename_zero== ki.kiouili
    os.path.join(filename_zero, "*.*")== ki.kiouili\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    
    filename== _po.rt.hos.txt
    filename_zero== _po.rt.hos
    os.path.join(filename_zero, "*.*")== _po.rt.hos\*.*
    glob.glob(os.path.join(filename_zero, "*.*"))== []
    

    glob.glob(os.path.join(filename_zero, ".")) 总是 [] 因为 os.path.join(filename_zero, ".") 是文件名而不是路径,然后是指令 os.rename(filename_zero, filename_zero.replace('.','_')) 从不做任何事。

    顺便说一句,我建议你更换

    for root, dirs, filenames in os.walk(folder):
        for filename in filenames:
    

    for filename in os.listdir(folder):
        if os.path.isfile(filename):
    

    或更好的imo(少一个缩进)

    for filename in ( f in os.listdir(folder) if os.path.isfile(f) ):
    

    我认为你采取的方式是一个僵局。如果我理解正确,您实际上想要做的是在扩展名之前替换文件名中的点和“+”,也就是说不替换在扩展名和扩展名之前分隔的点文件名,也不是扩展名中的“+”。无论如何,扩展本身有一个点和一个“+”是无稽之谈。

    所以你尝试使用 glob。但就个人而言,由于“。”的特殊情况。它划定了扩展,我不知道如何真正使用 glob 来实现该目标。

    所以我认为你必须采取另一种方式。 我们不必让 glob 检查所有文件名以验证它们是否与通配符模式匹配并仅返回必须处理的好文件名,而是必须迭代文件名列表并尝试替换“+”和“。”在扩展前部分。是的,在这个地方会有没有点和'+'的文件名,程序做的工作是徒劳的。但无论如何,同样的工作是由 glob 在幕后完成的。所以,与工作对抗,我更喜欢编写我能想象的代码,也就是说没有 glob。

    在我看来,以下代码是一个简短而有效的解决方案

    folder = "C:/Documents and Settings/DuffA/Bureaublad/shortcuts projects/klic01/11G008689_1"
    
    import os
    separ = os.sep
    
    for n in os.listdir(folder):
        print n
        if os.path.isfile(folder + separ + n):
            filename_zero, extension = os.path.splitext(n)
            os.rename(folder + separ + n , folder + separ + filename_zero.replace('.','_').replace('+','_') + extension)
    
    print '\n--------------------------------\n'
    for n in os.listdir(folder):
        print n
    

    结果

    +po.rt.hos.txt
    ar.am+is.doc
    arctic.txt
    ath+os.html
    atla.ntic.html
    d'a.rtagn+an
    dum+as.doc
    ki.kiouili.do+c
    
    --------------------------------
    
    arctic.txt
    ar_am_is.doc
    ath_os.html
    atla_ntic.html
    d'a.rtagn+an
    dum_as.doc
    ki_kiouili.do+c
    _po_rt_hos.txt
    

    【讨论】:

    • 太棒了!!非常感谢你这么好的答案!!我仍然无法理解网站上的每个人都是多么乐于助人和非常聪明! (显然除了我!!)谢谢!!
    【解决方案2】:

    你为什么在 os.walk for 循环中使用 glob 并覆盖 filename_zero 变量?

    for root, dirs, filenames in os.walk(folder): 
        for filename in filenames:
            filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1])
            filename_zero = filename_split[0]
            extension = filename_split[1].upper()
            if "." in filename_zero:
                os.rename(filename_zero, filename_zero.replace('.','_'))
    

    (未测试)

    【讨论】:

    • 好吧,我刚刚对我已经拥有的脚本和我找到的一些其他代码做了一个 frankenstine - 我想要做的是将文件名从扩展名中分离出来,然后运行查找和替换就可以了!
    • 第 25 行(最后一行)出现错误:Message File Name Line Position Traceback C:\Documents and Settings\DuffA\Mijn documenten\Renaming.py 25 WindowsError: [Error 2] 系统找不到指定的文件
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2012-03-12
    • 2015-12-23
    • 2014-08-17
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多