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

时间:2017-03-18 09:50:05

标签: python automation

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”。有人有想法吗?

1 个答案:

答案 0 :(得分: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