【问题标题】:Iterating Images in Directory By Name按名称迭代目录中的图像
【发布时间】:2018-08-03 19:59:56
【问题描述】:

希望这个问题相对容易回答,因为我还是 Python 新手。

我需要遍历名称为 [x]img[y] 的图像,其中 x 和 y 是确定如何处理图像的标识符。 x 确定进程,其值为 1 或 2,y 确定要在处理中使用的值之一。

所以,在伪代码中:

directory = 'my/path/to/images'
for image in directory:
    if x = 1:
        do process a with y
    elif x = 2:
        do process b with y
    else: print "ERROR"

我对代码和从字符串中提取值以拼凑我见过的各种不同示例还不够熟悉。我觉得我应该能够将字符串转换为数组并将第 1 和第 5 个值读取为整数,对吧?

非常感谢您的帮助,如果您想更好地了解我想通过这个项目完成什么,我已经创建了一个 GitHub 存储库here

非常感谢:)


编辑


感谢 Ely 让我走到这一步,但这又带来了另一个错误。这是我用来打开目录的测试代码,其中包含文件 1img2.png、1img4.png2img1.png

import os
import re
DIRECTORY = '/home/pi/Desktop/ScannerDev/TestPhotos/'


for img_filename in os.listdir(DIRECTORY):
    x, y = os.path.splitext(img_filename)[0].split('img')
    print 'Camera is ', x
    print 'Image is ', y
"""
for img_filename in os.listdir(DIRECTORY):
    a = re.search('^(.*)img(.*)\.png$', img_filename)
    if a is None:
        break
    else:
        x = a.group(1)
        y = a.group(2)
    print 'Camera is ', x
    print 'Image is ', y
"""

返回:

Camera is  2
Image is  1
Traceback (most recent call last):
  File "iteratorTEST.py", line 10, in <module>
    x, y = os.path.splitext(img_filename)[0].split('img')
ValueError: need more than 1 value to unpack

【问题讨论】:

  • @usr2564301 当我的问题解决后,我会接受解决问题的答案。如果您仔细查看我的编辑,您会看到返回代码显示 ValueError。还有“剩余的问题”:)
  • @AcrimoniousMirth 测试目录中是否有任何其他类型的文件正在被迭代?我使用您正在使用的相同图像名称和目录名称创建了自己的测试目录。当我复制/粘贴您的代码并在我的笔记本电脑上运行它时,它可以正常工作。
  • 不,这很奇怪。它完全是空的,但对于这 3 张图像。如果有另一种类型的文件,我也会期望这个问题。我将尝试重命名所有图像,因为这就是我目前所能想到的。 编辑我发现了问题。一些隐藏的文件夹。如果不是那种类型,我将不得不添加一个跳过的子句
  • 你也可以过滤掉不符合你假设的东西,比如for img_filename in filter(lambda x: x.endswith('.png'), os.listdir(DIRECTORY)
  • @ely haha​​h,实际上,一旦我找到隐藏文件并将其放在单独的答案中以使其清楚,我就直接了解了这一点。感谢您的所有帮助:)

标签: python string loops directory


【解决方案1】:

使用os.listdir 遍历目录中的图像文件:

for img_filename in os.listdir('my/path/to/images'):

    # in case you don't need to worry about anything but 'img'.
    x, y = img_filename.split('img')

    # in case you want to remove .png as in the comments.
    x, y = os.path.splitext(img_filename)[0].split('img')

    # do stuff here

如果您想在迭代目录时强制执行您的假设,例如 .png 文件名,您可以这样做:

raw_files = os.listdir(DIRECTORY)
for img_filename in filter(lambda x: x.endswith('.png'), raw_files):
    ...

for img_filename in [x for x in os.listdir(DIRECTORY) if x.endswith('.png')]:
    ...

或该想法的各种其他变体。

请注意,您可能还想进一步对上述xy 的结果进行后处理,例如将它们转换为int,或删除任何文件扩展名(如果文件名中存在),然后os 模块中的各种其他帮助函数将对此有所帮助。

此解决方案严格假设文件完全遵循您给定的格式,并且特殊字符串 img 仅在文件名中出现一次,并且充当 X 部分和 @987654332 之间的完美分隔符@你需要的部分。如果这个假设不成立,你将不得不做一些额外的处理。

【讨论】:

  • 您还可以通过 str[index] 访问字符串中的字符,就好像它是一个数组一样,并且在 if 条件下您可以直接将其与字符串进行比较,对吗?比如 x == '1'
  • 是的,如果您不需要对其执行整数运算,您可以将您的逻辑基于x 的字符串值结果。
  • @ely 感谢您的快速回复!是的,虽然 y 会变成多个数字,但每个图像都是 ximgy.png!拆分工具非常好,我会试一试:)
  • @ely 那么在提取 y 值之前读取时有没有办法删除“.png”?还是像 split 这样的其他运算符?
  • 你需要一个正则表达式来表示a = re.search('^(.*)img(.*)\.png$', filename) x = a.group(1) y = a.group(2)
【解决方案2】:

感谢 ely 对此的帮助以及其他人的回答帮助并展示了替代方法。 我将这篇文章作为一个单独的答案来给出我们在其自己的清晰区域中得出的最终解决方案

# To extract operators x and y from file named ximgy.png
# where y may be multiple characters long.
import os
DIRECTORY = '/home/pi/Desktop/ScannerDev/TestPhotos/'

for img_filename in os.listdir(DIRECTORY):
    # This ensure hidden files or others don't cause issues
    if img_filename.endswith(".png"):
        x, y = os.path.splitext(img_filename)[0].split('img')
        print 'Camera is ', x
        print 'Image is ', y
        # DO STUFF HERE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2018-06-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多