Python:如何替换文件名中的短横线?

-1 投票
3 回答
4016 浏览
提问于 2025-04-15 15:47

这个问题和关于递归重命名文件的回答有关。

代码经过修改以替换破折号,但在某些情况下并不奏效,比如:

./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('-', '_'))
            )

Python没有替换掉每一个破折号。我觉得这是因为文件名中包含了一些特殊符号,导致脚本提前停止了。所以我在归档时遇到了错误:

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命令的结束符,把“ - ”当作路径“./Beginners Tools/Hello's -Trojans-/bif43243”的选项符号。

3 个回答

2

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)

祝好,
阿瑟

1

你遇到的问题很可能是因为单引号、括号和破折号。你可以选择对它们进行转义,或者直接替换掉这些字符。

其实从你修改后的内容来看,你链接的原始代码是替换文件名中的字符,而不是整个路径。你需要对路径中的字符进行转义:

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

这其实很简单,你也可以使用正则表达式来转义一组字符。

我建议你在真正重命名之前,先运行一下os.walk,打印出那些特殊情况,看看在转义或替换这些字符之前和之后的情况。

撰写回答