不获取[Errno 2]这样的文件或目录:只要在Python脚本中更改文件名

2024-06-10 20:02:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Windows8中运行Python35

我有一个python脚本,它从典型的jpg图像文件中获取exif元数据。它看起来“正常”,但每当我在脚本中键入新文件名时,就会遇到“没有这样的文件或目录问题”

例如,我将两个图像182830.jpg和182833.jpg放在我的目录C:\Python35\Scripts中

我的python脚本(我从stack exchange中获取并修改以使其正常工作,如下所示)也放在同一个目录中,该脚本实际上可以从Python35的空闲编辑器中正常运行。或者至少,脚本将在首次应用于图像文件“182830.jpg”时运行

from PIL import Image
from PIL.ExifTags import TAGS

# path to the image or video
imagename = "182830.jpg"

# read the image data using PIL
image = Image.open(imagename)

# extract EXIF data
exifdata = image._getexif()

# iterating over all EXIF data fields
for tag_id in exifdata:
    # get the tag name, instead of human unreadable tag id
    tag = TAGS.get(tag_id, tag_id)
    data = exifdata.get(tag_id)
    # decode bytes 
    if isinstance(data, bytes):
        data = data.decode()
    #print("{tag:30}: {data}")
    print(tag, data)
image.close()

目前让我感到困惑和困惑的是-脚本将很好地运行该文件(即“182830.jpg”),如果我反复单击“运行”(在空闲编辑器中),脚本将保持良好运行

但是当我手动键入不同的文件名时,比如182833.jpg,我会收到一条错误消息,上面说[FileNotFoundError:[Errno 2]没有这样的文件或目录:“182833.jpg']

但是,非常有趣(并且可以重复)-如果我转到目录C:\Python35\Scripts,并实际使用鼠标复制文件的名称(而不是复制文件本身!),然后将复制的文件名粘贴到脚本中,脚本将正常工作/运行(始终)

另外-非常有趣的是,如果我将两个图像文件重命名为'pic1.jpg'和'pic2.jpg',那么(有趣的是)如果我只是通过手动将'1'(在pic1.jpg中)更改为'2'来编辑脚本,那么脚本绝对没有运行问题。。。反之亦然

任何有助于我理解“没有这样的文件或目录”问题的帮助都将是非常棒的

我发现,如果我从目录中抓取(例如,复制文件名)文件名(并将该名称粘贴到我的脚本中!),问题就永远不会发生。我发现手动编辑(通过键入)脚本中的文件名会导致“没有这样的文件”问题。提前谢谢大家


Tags: 文件theimage目录脚本iddata键入
1条回答
网友
1楼 · 发布于 2024-06-10 20:02:57

您可以浏览一下您正在空闲状态下运行此脚本的事实,但这可能是问题的一部分

老实说,这听起来像是一个工作目录问题或类似的问题;此外,您真的不应该将自己的代码(更不用说图像之类的数据)放在C:\Python35\Scripts中;这主要由pip和其他Python工具管理

因此,假设您将脚本和文件一起移动到C:\KennysExifProgram\program.py,那么

C:\KennysExifProgram\program.py
C:\KennysExifProgram\182830.jpg
C:\KennysExifProgram\182833.jpg

我们可以编辑程序,使其在该目录中的所有JPEG中运行,最重要的是我们使用我们知道这些文件所在目录的绝对路径:

from PIL import Image
from PIL.ExifTags import TAGS
import glob
import os


def show_image_exif(imagename):
    # read the image data using PIL
    image = Image.open(imagename)

    # extract EXIF data
    exifdata = image._getexif()

    # iterating over all EXIF data fields
    for tag_id in exifdata:
        # get the tag name, instead of human unreadable tag id
        tag = TAGS.get(tag_id, tag_id)
        data = exifdata.get(tag_id)
        # decode bytes
        if isinstance(data, bytes):
            data = data.decode()
        # print("{tag:30}: {data}")
        print(tag, data)


image_directory = r"C:\KennysExifProgram"

# Figure out a list of all images
all_images = glob.glob(os.path.join(image_directory, "*.jpg"))

# Loop over them
for image in sorted(all_images):
    print(image)
    show_image_exif(image)
    print("========")

这对你来说应该更好!:)

(您还可以使用image_directory = os.path.dirname(__file__)将程序默认设置为其自身所在的目录。)

相关问题 更多 >