用 Python 重命名文件似乎不起作用(os.rename)

Posted

技术标签:

【中文标题】用 Python 重命名文件似乎不起作用(os.rename)【英文标题】:Renaming files with Python doesn't seem to work (os.rename) 【发布时间】:2017-03-18 09:50:05 【问题描述】:
import time, os

timestamp = time.strftime('%d.%m_%H:%M')

while True:
    print("Beginning checkup")
    print("=================")
    for fname in os.listdir("C:/SOURCE"):
        if fname.endswith(".txt"):
            print("found " + fname)
            os.rename(fname, fname.replace(fname, timestamp + ".txt"))
            time.sleep(5)

这是我的代码。它应该做的是在 SOURCE 中查找 .txt 文件并在名称中添加时间戳。这不知何故给了我一个“FileNotFoundError”。有人有想法吗?

【问题讨论】:

Windows 文件名中不能有冒号 : 【参考方案1】:

几个问题

os.listdir 返回文件名,不带路径。 时间戳有一个:,你不能用它作为文件名 您将文件重命名为同一个文件,因为您的替换工作不正常!

所以重命名时你必须使用os.path.join 来提供os.rename() 的完整路径

下一个问题是您添加时间戳的替换是错误。它不添加时间戳,而是完全替换文件名。

fname.replace(fname, timestamp + ".txt"))

严格等价于

timestamp + ".txt"

另一个小问题是,如果文件以.TXT 结尾,则过滤器不会检测到它。对于复杂的通配符,最好使用fnmatch 模块。就你而言,我刚刚申请了lower()

我的完整修复建议,它在您目录的所有 txt 文件中插入时间戳:

timestamp = time.strftime('%d_%m_%H_%M') # only underscores: no naming issues
the_dir = "C:/SOURCE"
for fname in os.listdir(the_dir):
    if fname.lower().endswith(".txt"):
        print("found " + fname)
        new_name = "_.txt".format(os.path.splitext(fname)[0],timestamp)
        os.rename(os.path.join(the_dir,fname), os.path.join(the_dir,new_name))

当然,您也可以将os.chdir 转到正确的目录,但在复杂的应用程序中不建议这样做,因为这可能会破坏应用程序的其他部分。

您可能更喜欢使用 glob 仅在 txt 文件上计算绝对路径和过滤器的替代方法

import glob

for fname in glob.glob(os.path.join("C:/SOURCE","*.txt")):
   # now fname bears the absolute path

【讨论】:

这该死的逻辑,我去看看。 似乎可以工作,但路径格式似乎适用于 linux,因为它将 // 添加到在 Windows 上不起作用的路径。我该如何解决? 路径格式在 Windows 上运行良好。你能说得更具体点吗? 啊,好吧是我的错误,现在可以使用。感谢您提供完整的勺子,我会尝试理解您的代码

以上是关于用 Python 重命名文件似乎不起作用(os.rename)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 VBScript 重命名文件?

使用 Multer 重命名上传的文件不起作用 (Express.js)

Apple 文件应用程序“重命名”文件/文件夹功能在文件提供程序扩展中不起作用

重命名文件扩展名不起作用

为啥这不重命名我的文件? [复制]

Codeigniter重命名图像文件不起作用