2017-09-25 12 views
0

Je suis en train de coder un programme qui, pour tous les fichiers d'un répertoire (les 101 fichiers sont déjà nommés 0.jpg à 100.jpg, dans l'ordre) ouvre les fichiers, les redimensionne en fonction d'un ratio, puis enregistre la sortie dans un répertoire différent en fonction de l'index de la boucle for avec enumerate. Je suis confus quant à savoir pourquoi mes index et noms de fichiers ne correspondent pas. L'index de la boucle for s'exécute de 0 à 100 et les noms de fichiers aussi. La boucle for doit appeler les fichiers d'image source dans un ordre séquentiel de 0 à 100 et les enregistrer dans l'ordre séquentiel en raison de l'index. Mais, quand j'ai exécuté le programme, ce qui était l'image source 100 (qui devrait être la plus grande image redimensionnée) est maintenant sauvegardé sous 3.jpg et est la quatrième plus petite image. Qu'est-ce que l'image 3 est maintenant l'image 24. Peut-être que plus de changements résultent de cela. Cependant, à des images plus grandes, la commande est correcte.PIL Images sauvegardées dans le mauvais ordre (pour la boucle, énumérer les index)

Voici mon code:

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 

J'ai même fait en sorte de trier les fichiers. Les ratios et les index s'impriment tous correctement. Qu'est-ce qu'il se passe ici?

+0

Que obtenez-vous si vous imprimez (fichiers) avant files.sort()? Et si vous imprimez (fichiers) après? – Hugo

Répondre

1

os.listdir peut ne pas renvoyer un agenda correctement trié. Vous devez trier le tableau avant de le parcourir. Une meilleure façon de procéder consiste à utiliser le nom de fichier d'origine au lieu de l'itérateur. Vous pouvez utiliser le code suivant qui utilise une fonction 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() 

Mise à jour sur 26/9/2017
J'ai testé votre code dans mon ordinateur. J'ai trouvé j'ai fait une erreur dans sort().
Voici la console qui imprime le paramètre tout au long de l'itération.

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 

Le problème de sort() fonction volonté est que la fonction compare toujours le caractère de chaîne par caractère. Par conséquent, le résultat ne correspondra pas à l'index.
J'ai fait quelques petits changements sur votre code. Cela fonctionne dans mon ordinateur pour produire un résultat attendu.

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

Bienvenue sur SO! S'il vous plaît ne posez pas de questions dans les réponses. Essayez d'être aussi clair et concis que possible et fournissez le code si possible/nécessaire. – wp78de

+0

Merci pour votre rappel. Je vais l'éditer plus tard. Désolé pour le dérangement. –

+0

Je dois utiliser le nom de fichier d'origine, mais j'ai déjà trié les fichiers dans mon code avec files.sort() et le même résultat est produit. –