【问题标题】:Python Iterating through Directories and RenamingPython遍历目录和重命名
【发布时间】:2017-02-04 06:35:46
【问题描述】:

我正在尝试遍历子目录列表,然后打开该子目录中的文件并将文件重命名为小写。这是我的代码:

for root, subdirs, pics in os.walk(rootdir):
  for pic in pics:
    if pic.endswith('.jpg'):
        picpath = os.path.join(pic)
        #print pic
        print picpath
        #os.rename(pic, pic.replace(" ", "-").lower())
        os.rename(picpath, picpath.replace(" ", "-").lower())

然后我得到:

Traceback(最近一次调用最后一次):文件“imageresizing-renamefiles.py”,第 19 行,在 os.rename(picpath, picpath.replace(" ", "-").lower()) OSError: [Errno 2] 没有这样的文件或目录

我的文件结构是一个根目录,代码从该文件夹中运行并在该文件夹内运行如下 folder1Image1jpgImage2jpgfolder2Image3jpgImage4jpg 等等。我想遍历每个以将文件(而不是文件夹)重命名为小写名称。

感谢任何帮助。

【问题讨论】:

  • 您可能想将topdown=False 传递给os.walk
  • picpath = os.path.join(pic) -> picpath = os.path.join(root, pic)
  • @mgilson 好主意在这里不需要,但如果需要重命名目录可能会非常有用。
  • @Jean-FrançoisFabre -- 是的,我认为你是对的。在发表评论之前,我并没有真正仔细研究这个问题......
  • @mgilson 典型的 XY 问题 :) OP 有想象力来制造恶性问题 :)

标签: python iteration rename


【解决方案1】:
picpath = os.path.join(root, pic)
                    #  ^^^^^

看起来它应该可以完成这项工作。每the docs

请注意,列表中的名称不包含路径组件。要获取 dirpath 中文件或目录的完整路径(以 top 开头),请执行 os.path.join(dirpath, name).

这就是您收到“没有这样的文件”错误的原因:您正在询问当前目录中的文件名,在错误发生时不是 root

【讨论】:

  • if pic.endswith('.jpg'): 也不安全。最好使用if pic..lower().endswith('.jpg'):fnmatch 模块以避免看不到IMG.JPG
  • @Gshare 如果您仍然遇到相同代码的问题,请edit your question 将更改添加到末尾(不要替换已经存在的内容)。如果这个问题解决了,现在你有不同的问题,请提出一个新问题!
  • 目标中的lower() 将在区分大小写的文件系统上杀死它:python 将无法将整个 dir 结构重命名为小写!!
  • 谢谢大家-感谢我使用了picpath = os.path.join(root, pic),我可以看看我是否在那个级别打印它现在打印完整路径,这很好但它仍然失败并出现同样的错误。
【解决方案2】:

您必须将目录名称附加到您的路径,否则os.rename 无法找到应用重命名的正确目录。

也就是说,您转换为小写字母会使任务复杂化。小写只能应用于基本名称(这将在 Windows 文件系统上工作,因为大小写无关紧要,但如果路径的某些目录包含大写字母,则会在 Linux 上失败:幸运的是,您不能用单个 @987654324 重命名整个脏树@命令)

无论大小写如何,都应该匹配.jpg 扩展名,特别是如果你想将图片名称转换为小写:扩展名也可能是大写的(就像所有那些 DCIM 相机一样)

for root, subdirs, pics in os.walk(rootdir):
  for pic in pics:
    if pic.lower().endswith('.jpg'):  # more powerful: fnmatch.fnmatch(pic,"*.jpg")
        os.rename(os.path.join(root,pic), os.path.join(root,pic.replace(" ", "-").lower()))

【讨论】:

  • 好收获!当然,这是一个微妙的问题。
  • @cxw:我不想同时发布答案,但仍有几个潜在问题,因此很难对每个问题发表评论。希望你不要介意。
  • 当然不是!无论如何,如果你解决了 OP 的问题,你应该得到你应得的代表:)。实际上,我个人更喜欢 cmets 的答案编辑或答案帖子(这可能是我永远不会成为版主的原因之一 ;))。
  • 非常感谢大家.....让-弗朗索瓦,您的最新修复完美......再次感谢。
  • @Jean-FrançoisFabre 100% C=(您是第一个认识并评论它的人;))!题外话——我在你的网页上看到了 Amigaaaaah 的东西——如果你不知道演示场景,你应该去看看。例如,this (details)。所有实时渲染:)
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
相关资源
最近更新 更多