用 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)的主要内容,如果未能解决你的问题,请参考以下文章
使用 Multer 重命名上传的文件不起作用 (Express.js)