2017-09-25 45 views
0

我正在編寫一個程序,該目錄中的目錄中的所有文件(101個文件已按順序命名爲0.jpg到100.jpg)將打開文件,根據比例調整它們的大小,然後根據枚舉的for循環的索引將輸出保存到不同的目錄中。我很困惑,爲什麼我的索引和文件名不匹配。 for循環的索引從0到100,文件名也是如此。 for循環應該按照從0到100的順序調用源圖像文件,並且由於索引而按順序保存它們。PIL按錯誤順序保存的圖像(for循環,枚舉索引)

但是,當我運行程序時,源圖像100(它應該是最大尺寸的圖像)現在保存爲3.jpg,並且是第四小圖像。圖像3現在是圖像24.可能由此產生更多的變化。但是,在較大的圖像下,順序是正確的。

這裏是我的代碼:

os.makedirs("resized images") 
try: 
    files = os.listdir(os.path.join(os.getcwd(),"source images")) 
except IOError: 
    print('No folder found.') 
    input('Enter any key to exit: ') 
    exit() 

xDimension=dimensions[0] 
yDimension=dimensions[1] 
print(xDimension) 
print(yDimension) 
totalViews=0 
for item in d: 
    totalViews+=d[item] 
files.sort() 
for index, file in enumerate(files): 
    path = os.path.join(os.getcwd(), "source images", file) 
    img = Image.open(path) 
    ratio=(d[index]/totalViews) 
    print(ratio) 
    print(str(index)) 
    resizedX=int(math.ceil((xDimension*ratio))) 
    resizedY=int(math.ceil((yDimension*ratio))) 
    resized=img.resize((resizedX, resizedY)) 
    resized.save("resized images/"+str(index)+".jpg", 'JPEG') 
#image 100 in source images becomes image 3 in resized images, making image 3 become image 24 

還送了我一定要對文件進行排序。比率和索引全部正確打印。這裏發生了什麼事?

+0

如果你在files.sort()之前打印(文件),你會得到什麼?如果你在它後面打印(文件)呢? – Hugo

回答

1

os.listdir可能不會返回正確排序的文件。在迭代之前,您應該對數組進行排序。更好的方法是使用原始文件名而不是迭代器。
您可以嘗試使用array.sort()函數的以下代碼。

try: 
    files = os.listdir(os.path.join(os.getcwd(),"source images")) 
    files.sort() 
except IOError: 
    print('No folder found.') 
    input('Enter any key to exit: ') 
    exit() 

上26/9/2017
我已經在我的電腦測試你的代碼更新。我發現我在sort()中犯了一個錯誤。
以下是在整個迭代過程中打印參數的控制檯。

file = 0.png 
index = 0 

file = 1.png 
index = 1 

file = 10.png 
index = 2 

file = 11.png 
index = 3 

file = 12.png 
index = 4 

file = 13.png 
index = 5 

file = 14.png 
index = 6 

file = 2.png 
index = 7 

file = 3.png 
index = 8 

sort()功能意志的問題是,該函數總是由字符字符串的字符進行比較。因此,結果與索引不匹配。
我對你的代碼做了一些修改。它在我的電腦中工作以產生預期的結果。

for index, file in enumerate(files): 
    path = os.path.join(os.getcwd(), "source images", file) 
    img = Image.open(path) 
    # do your operation 
    # Use the file name itself instead of the index 
    img.save("resized images/"+ file, 'JPEG') 
+0

歡迎來到SO!請不要在答案中提問。儘量做到儘可能清晰和簡潔,並儘可能/必要時提供代碼。 – wp78de

+0

謝謝你的提醒。稍後我會編輯它。對不起,煩惱。 –

+0

我可能不得不使用原始文件名,但我已經用files.sort()對我的代碼中的文件進行了排序,併產生了相同的破壞結果。 –