具有相对路径和绝对路径的PIL图像中的FileNotFoundError

问题描述 投票:0回答:3
import PIL.Image as pilimg
import numpy as np

# Read image
im = pilimg.open("../dataset/start.jpg")

# Display image
im.show()

# Fetch image pixel data to numpy array
pix = np.array(im)

(我不是数据集的作者,所以我无法上传整个项目文件。)

我正在尝试使用 Pillow 读取图像并将其转换为 NumPy 数组。但是,我尝试了几种方法,例如使用绝对路径和 PIL image.open() 中的方法适用于某些图像,但不适用于其他图像,除了使用 OpenCV 的方法。但是,它总是导致 FileNotFound。

start.jpg
的绝对路径是
F:\GIST 강의 자료\2021 1학기\EC3202 신호 및 시스템\Programming Assignment\dataset\start.jpg
。我相信从
start.jpg
src/program.py
的相对路径是
../dataset/start.jpg

我正在使用 conda 4.10.1 和 python 3.8.8 以及 windows 10。

python python-imaging-library file-not-found
3个回答
2
投票

路径是相对于当前工作目录的。 如果您不确定 cwd 是什么,您可以通过执行以下操作找到它:

print(f"Current working dir: {os.getcwd()})

然后您可以使用

os.path.join
从那里连接您的相对路径

os.path.join(os.getcwd(),'dataset/start.jpg')

2
投票

不要依赖 os.getcwd 作为相对路径。原因如下所示。

请使用

pathlib.Path
。即考虑这些结构。

x:/
 ├ A
 ┃ ├ 1.png
 ┃ ├ 2.png
 ┃ ├ 3.png
 ┃ ├ 4.png
 ┃ └ 5.png
 ┃
 └ B
   └ script.py

如果您想从 script.py

1.png
可靠地访问 ,您最好使用 __file__
 来确定脚本的路径 - 因为当前工作目录可能与实际脚本位置不同,如下例所示输出。

import pathlib import os print("Current cwd: ", os.getcwd()) # Get current script's folder script_location = pathlib.Path(__file__).parent # get data folder data_location = script_location.parent / "A" # single file example png_file = data_location / "1.png" # alternatively can iterate thru directory for file_ in data_location.iterdir(): # print full path in linux style print(f"{file_.absolute().as_posix()}")
(Accessing file in different path in absolute path)

jupiterbjy@NYARUDESK/D: py X:\B\script.py
Current cwd:  D:\
X:/A/1.png
X:/A/2.png
X:/A/3.png
X:/A/4.png
X:/A/5.png


(Change directory)

jupiterbjy@NYARUDESK/D: 
❯ cd x:


(Now use indirect path)

jupiterbjy@NYARUDESK/X: py .\B\script.py
Current cwd:  X:\
X:/A/1.png
X:/A/2.png
X:/A/3.png
X:/A/4.png
X:/A/5.png
查看 cwd - 当前工作目录 - 每次运行的 

os.getcwd

 有何不同。

但是,无论您在何处间接或直接访问该脚本,在文件夹

B 外部或内部,您都可以使用 __file__

 对象的 
.parent
.joinpath
pathlib.Path
 方法相对可靠地访问文件。

查看

pathlib

这里的文档,我看到你是韩国人,这是韩国文档的链接。
    


0
投票
提供图像的完整绝对路径。对于我的情况,我做了以下操作:

Image.open(f'{os.getcwd()}/{project-name}/{image-file-name}.{file-extension}')


请注意,图像文件必须与您的项目位于同一文件夹中。

有关更多详细信息,请参阅

PIL.open

 方法来了解库如何处理文件访问。
    

© www.soinside.com 2019 - 2024. All rights reserved.