2014-07-10 1 views
0

여러 개의 jpeg 파일에서 EXIF ​​정보를 한 번에 가져올 간단한 스크립트를 만들려고하지만 절대 경로 대신 변수를 사용하려고하면 "IOError : 이미지 파일을 식별 할 수 없습니다"라는 메시지가 나타납니다. 사용중인 코드는 다음과 같습니다.경로 대신 변수를 사용하여 파이썬에서 PIL을 사용하여 이미지 파일을 열려면 어떻게해야합니까?

import os 
from PIL import Image, ExifTags 

source = raw_input("Enter the path to scan") 
os.chdir(source) 
for root, dirs, files in os.walk(source): 
    for file_name in files: 
     img = Image.open(file_name) 
     exif = { ExifTags.TAGS[k]: vars for k, vars in img._getexif().items() if k in ExifTags.TAGS } 
     print exif 

Google에서 내 문제를 검색하는 동안 발견 된 팁 당 StringIO를 사용하여 시도해 보았습니다.

img = Image.open(StringIO(file_name)) 

이 해결되지 않은 문제와 내가 같은 오류가 발생합니다 : 내가 StringIO를 가져오고 Image.open 코드에 다음 변경을 제외하고 위와 같이 코드는 동일합니다. Image.open에 변수 대신 경로를 지정하면 올바르게 작동하므로 문제가 변수를 사용하려고합니다. 내가 실종 됐다는 것을 알 수있는 방법이 있나? 당신이 그들을 열려고하면 다음 오류가 계속 될 것입니다,

img = Image.open(os.path.join(root, file_name)) 

을 당신이 당신의 디렉토리 계층 구조가 아닌 이미지 파일이있는 경우, 그러나 그것은이다

+0

"IOError : 이미지 파일을 식별 할 수 없습니다"라는 메시지가 뜨면'file_name'의 값은 무엇입니까? 파일 이름이 "readme.txt"또는 뭔가라면 PIL이 이미지로 열 수 없게됩니다. 또한 원본 폴더에 중첩 폴더가 있습니까? 예를 들어,'os.walk'는 "source/pictures"폴더에서'lenna.jpg'을 식별 할 수 있습니다. Image.open (file_name)은 lenna의 현재 활성 디렉토리 "source"를보고 있기 때문에 실패합니다. jpg, 실제로 "소스/그림"에있을 때. – Kevin

+0

비 이미지 파일의 오류를 방지하기 위해 jpg 파일 만있는 디렉토리에서이 파일을 테스트하고 있음을 완전히 잊었습니다. Jamie가 게시 한 코드는 하위 폴더 문제도 처리합니다. – DarkKnight4251

답변

1

는 대신이 코드를 사용할 필요가 합법적 인 오류이므로 다음과 같이 할 수 있습니다 :

try: 
    img = Image.open(os.path.join(root, file_name)) 
except IOError: 
    print "Error: %s does not appear to be a valid image" % (os.path.join(root, file_name)) 
else: 
    exif = ... 
+0

이것은 완벽하게 작동했습니다. 고맙습니다! 나뿐만 아니라 나중에 문제가 실행되지 않도록 비 이미지 파일에 대한 오류 검사를 추가합니다. – DarkKnight4251

관련 문제