2009-11-24 3 views
32

Je suis relativement nouveau en programmation et j'ai commencé à apprendre Python. Ce que je veux faire est de recolorer les sprites pour un jeu, et on me donne les couleurs d'origine, suivi de ce à quoi ils doivent être transformés. Chaque sprite a entre 20 et 60 angles, donc en boucle chacun dans le dossier pour chaque couleur est probablement le chemin à parcourir pour moi. Mon code va ainsi;Boucler les fichiers dans un dossier

import media 
import sys 
import os.path 

original_colors = str(raw_input('Please enter the original RGB component, separated ONLY by a single space: ')) 
new_colors = str(raw_input('Please insert the new RGB component, separated ONLY by a single space: ')) 
original_list = original_colors.split(' ') 
new_list = new_colors.split(' ') 
folder = 'C:\Users\Spriting\blue' 
if original_colors == 'quit' or new_colors == 'quit': 
    sys.exit(0) 
else: 
    while 1: 
     for filename in os.listdir (folder): 
      for pix in filename: 
       if (media.get_red(pix) == int(original_list[0])) and (media.get_green(pix) == int(original_list[1])) and \ 
        (media.get_blue(pix) == int(original_list[2])): 
        media.set_red(pix, new_list[0]) 
        media.set_green(pix, new_list[1]) 
        media.set_blue(pix, new_list[2]) 

        media.save(pic) 

Mais je continue à avoir une erreur sur le chemin, et pix étant une valeur de chaîne (ils sont toutes les images)

Toute aide appréciée.

+0

Pouvez-vous afficher le message d'erreur spécifique que vous obtenez? – perimosocordiae

+0

Est-ce une tâche scolaire? Tous les résultats de recherche que je reçois de Google sur votre module "media" semblent indiquer que c'est ... –

Répondre

3

Le chemin est incorrect car les barres obliques inverses doivent être doublées - la barre oblique inversée est un échappement pour les caractères spéciaux.

os.listdir ne retourne pas les fichiers ouverts, il retourne les noms de fichiers. Vous devez ouvrir le fichier en utilisant le nom de fichier.

34

os.listdir() renvoie une liste de noms de fichiers. Ainsi, filename est une chaîne. Vous devez ouvrir le fichier avant de le parcourir, je suppose.

Faites également attention aux barres obliques inverses dans les chaînes. Ils sont principalement utilisés pour des séquences d'échappement spéciales, vous devez donc leur échapper en les doublant. Vous pouvez utiliser la constante os.sep être plus portable, ou même utiliser os.path.join():

folder = os.path.join('C:\\', 'Users', 'Sprinting', 'blue') 
10
for pix in filename: 

itère sur les lettres du nom de fichier. Donc, ce n'est certainement pas ce que vous voulez. Vous aurez probablement envie de remplacer cette ligne par:

with open(filename) as current_file: 
    for pix in current_file: 

(en supposant Python 2.6) et le reste en retrait de la boucle en conséquence.

Cependant, je ne suis pas sûr que la nouvelle boucle for fasse ce que vous voulez, sauf si par pix vous voulez dire une ligne de texte dans le fichier actuel. Si les fichiers sont des fichiers image binaires, vous devez d'abord lire leur contenu correctement - pas assez d'informations dans votre message pour deviner ce qui est juste ici.