【问题标题】:Loop through files of given type in a directory遍历目录中给定类型的文件
【发布时间】:2017-11-02 23:20:22
【问题描述】:

我有一个需要循环访问的 .jpg 文件目录,并且必须使用 python program.py directory/*.jpg 从命令行调用它 我的代码只找到该文件夹​​中的第一张图片。

import sys, glob

arg = sys.argv[1]
files = glob.glob(arg)
for fname in files:
    print(fname)

它只打印文件夹中第一个文件的名称,当我打印列表文件的长度时,它返回1。

编辑:print(arg) 打印的是第一个文件的名称,而不是目录,我该如何解决这个问题,sys.argv[1] 应该是目录/*.jpg 没有?

【问题讨论】:

  • 不看你的目录/目录结构就没什么好说的了
  • 冒着问一个愚蠢问题的风险,您确定该目录中有超过 1 个 jpg 吗?
  • 可能是os模块的walk()方法可以帮到你。
  • 该目录中有 25 张 jpg,我几乎可以完全确定目录/结构没有问题
  • ls directory/*.jpg 的输出是什么?文件所在的目录名是什么?

标签: python file


【解决方案1】:

您的代码没有问题,但您没有正确转义通配符。 尝试将您的脚本运行为:

python program.py directory/\*.jpg

当您运行 python program.py directory/*.jpg 时,shell 会扩展通配符,导致 argv[1] 成为第一个匹配的文件名,从而导致调用 glob 时不是使用 <directory>/*.jpg 而是使用 <directory>/<firstFile>

如果在 glob 调用之前添加print arg,您可以很容易地看到。

例如,如果您的目录包含两个文件,0606163.jpg 和 060611231.jpg

python program.py directory/*.jpg 将等同于 python program.py directory/0606163.jpg directory/060611231.jpg

【讨论】:

  • 谢谢,这行得通。我还通过简单地将 sys.argv 调用放入循环中来解决它。 for fname in sys.argv[1:]: print (fname)
  • @Chaz 如果您依赖 shell 变量扩展,则无需调用 glob。
【解决方案2】:

我个人使用os.walk()

import os
for root, dirs, files in os.walk('YOUR_PATH_OR_SYS_ARG_HERE'):
    for file in files:
        if file.endswith('.jpg'):
            print(file)

【讨论】:

  • 不支持通配符。
  • @ventsyv 没有使用通配符,代码就像一个魅力。
【解决方案3】:

也许你可以使用listdir

import os
jpgFiles = os.listdir('your/path/here')

for file in jpgFiles:
        print(file)

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 2017-06-22
    • 2014-06-17
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多