Python PIL从特定文件打开图像

Python PIL从特定文件打开图像,python,operating-system,anaconda,python-imaging-library,Python,Operating System,Anaconda,Python Imaging Library,我开始学习Python中的枕头库。我有一个存储代码的文件夹1,在该文件夹中还有另一个文件夹2,我想编辑/处理的所有图片都在该文件夹中 但是,我只能在图像保存在文件夹1中时访问这些图像,而不能在图像仅保存在文件夹2中时访问这些图像 我使用了以下代码: from PIL import Image import os for k in os.listdir('.'): if k.endswith('.jpg'): i = Image.open(k) kn, k

我开始学习Python中的枕头库。我有一个存储代码的文件夹1,在该文件夹中还有另一个文件夹2,我想编辑/处理的所有图片都在该文件夹中

但是,我只能在图像保存在文件夹1中时访问这些图像,而不能在图像仅保存在文件夹2中时访问这些图像

我使用了以下代码:

from PIL import Image
import os

for k in os.listdir('.'):
    if k.endswith('.jpg'):
        i = Image.open(k)
        kn, kext = os.path.splitext(k)
        print(kn)
它打印所有文件名的名称减去扩展名“.jpg”:

MeisJeMetDeParel
StarryNight
TheSonOfMan
然后我也尝试了同样的方法,只从他们自己的特定文件夹中访问图像:

for k in os.listdir('testPictures'):
    if k.endswith('.jpg'):
        i = Image.open(k)
        kn, kext = os.path.splitext(k)
        print(kn)
通过将目录更改为文件夹名称,它们将存储在testPictures中。但是,我得到了一个错误:

FileNotFoundError: [Errno 2] No such file or directory: 'MeisJeMetDeParel.jpg'
因此,文件夹中的图像似乎正在被访问,因为它能够识别文件夹中第一个图像的名称,但代码无法打印图像的名称,因为当代码和图像一起保存时,它能够打印图像的名称。我可以对代码进行哪些调整,以便打印testPictures文件夹中的图片? 感谢

os.listdir函数返回一个相对于指定目录的路径,因此您必须使用os.path.join将目录连接到您获得的名称:

for k in os.listdir('testPictures'):
    if k.endswith('.jpg'):
        i = Image.open(os.path.join('testPictures', k))
        kn, kext = os.path.splitext(k)
        print(kn)
我可能建议您不必调用os.listdir并手动检查扩展名,而可以使用glob模块,还可以避免使用os.path.join目录名:

import glob
for k in glob.glob('testPictures/*.jpg'):
    i = Image.open(k)
    kn, kext = os.path.splitext(k)
    print(kn)

这段代码是在Linux、macOS还是Windows上运行的?Windows 10 64位Hi,这似乎可以解决问题,谢谢。还有一些事情:我想知道testPictures/*.jpg中的*在做什么?在从数组中打印项目时,我使用*删除方括号和引号。另一件事是,图像名称在每个名称之前都会打印“testPictures”,例如“testPictures\StarryNight”。我怎样才能只显示文件名?ThanksUpdate将printkn更改为printkn[13:],这样就不会显示每个文件名之前的“TestPictures\”。这是可以接受的还是有更好的方法?Thanks@tewi*是一个通配符。glob'testPictures/*.jpg'将查找testPictures下以jpg结尾的所有文件。这个*基本上意味着什么。查看更多信息information@tewi您还可以使用os.basename从路径中删除目录。所以os.basename/usr/local/bin/something.sh==something.sh,或者,如果您在windows下,os.basenameC://directory/file.bat==file.bat.Great,非常有用。谢谢您: