代码之家  ›  专栏  ›  技术社区  ›  anon

python:如何替换文件名中的破折号?

  •  -1
  • anon  · 技术社区  · 15 年前

    这个问题与 answer 关于递归重命名文件。

    更改为替换破折号的代码不适用于以下情况:

    ./Beginners Tools/Hello's -Trojans-/bif43243
    ./Linux/Nux Col - 1 Works (TEX & Pdf) - T'eouhsoe & More (33323 - 34432)
    ./Git/peepcode-git-mov/c6_branch_merge.mov
    ./haskell/OS 2007 - T aoue
    ./B Sites for Get-Big
    

    它适用于以下案例:

    ./oeu'oeu - X ee ls - Feb 2008.pdf
    

    所以我需要分析数据。如何正确替换破折号?

    [细节]

    代码来自链接,但已更改为替换“—”:

    import os
    for dirpath, dirs, files in os.walk(your_path):
        for filename in files:
            if '&' in filename:
                os.rename(
                    os.path.join(dirpath, filename),
                    os.path.join(dirpath, filename.replace('-', '_'))
                )
    

    巨蟒并没有取代每一个破折号。我认为是因为名字中包含了一些特殊的符号,这些符号使脚本提前停止了运行。所以我在存档时遇到了错误:

    tar cvzf sed_backup.tar.gz `find documents | sed  s/\.*/\'\&\'/`
    tar: rojans-: Cannot stat: No such file or directory
    tar: Error is not recoverable: exiting now
    

    由于名称中仍保留“'”和“-”符号,tar命令将“'”解释为find命令的结束,将“'”解释为路径中的选项符号。“/初学者工具/hello's-trojans-/bif43243”

    3 回复  |  直到 13 年前
        1
  •  1
  •   Steven Graham    15 年前

    最有可能的问题是单引号、括号和破折号。你要么逃走要么替换它们。

    实际上,在查看您的编辑时,链接到的原始代码正在替换文件名中的字符,而不是整个路径中的字符。您需要转义路径中的字符:

    esc_dirpath = dirpath.replace('-','\-')
    

    这相当简单,还可以使用regex来转义一组字符。

    我建议在实际执行重命名之前,在转义/替换这些字符之前和之后运行操作系统walk并打印出特殊情况。

        2
  •  2
  •   Arthur Debert    15 年前

    在遍历文件系统树时,os.path.walk非常方便,这是一个简单的示例:

    import os, shutil
    
    def rename_file(arg, dirname, filename):
       filepath = os.path.join(dirname, filename)
        # check if file meets your rename condition here
        if os.path.isfile(filepath):
           new_name = "something"
           shutil.move(filepath, os.path.join(dirname, new_name)
    
    os.path.walk(base_dir, rename_file, None)
    

    当做 亚瑟

        3
  •  0
  •   scc    13 年前