2009-11-24 24 views
32

Soy bastante nuevo cuando se trata de programación, y he empezado a aprender Python.Looping a través de archivos en una carpeta

Lo que quiero hacer es recolour sprites para un juego, y me dan los colores originales, seguidos de lo que se van a convertir. Cada sprite tiene entre 20 y 60 ángulos, entonces recorriendo cada uno en la carpeta para cada color es probablemente el mejor camino para mí. Mi código va así;

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) 

pero aparece un error en el nombre de ruta y el pix ser un valor de cadena (son todas las imágenes)

Cualquier ayuda apreciada.

+0

¿Puede mostrar el mensaje de error específico que está recibiendo? – perimosocordiae

+0

¿Es esto una tarea escolar? Todos los resultados de búsqueda que recibo de Google en su módulo de "medios" parecen indicar que es ... –

Respuesta

3

La ruta es incorrecta porque las barras diagonales inversas deben doblarse hacia arriba: la barra diagonal inversa es un escape para caracteres especiales.

os.listdir no devuelve archivos abiertos, devuelve nombres de archivo. Necesita abrir el archivo usando el nombre del archivo.

34

os.listdir() devuelve una lista de nombres de archivos. Por lo tanto, filename es una cadena. Necesitas abrir el archivo antes de iterar en él, supongo.

Además, tenga cuidado con las barras diagonales inversas en las cadenas. En su mayoría se utilizan para secuencias de escape especiales, por lo que debe escapar al duplicarlos. Se podría utilizar la constante os.sep ser más portátil, o incluso utilizar os.path.join():

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

itera sobre las letras del nombre de archivo. Entonces eso ciertamente no es lo que quieres. Es probable que desee para reemplazar esa línea por:

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

(suponiendo Python 2.6) y sangrar el resto del bucle en consecuencia.

Sin embargo, no estoy seguro de que el nuevo bucle for haga lo que desee a menos que pix signifique una línea de texto en el archivo actual. Si los archivos son archivos de imágenes binarias, primero tendrá que leer sus contenidos de forma correcta, no hay suficiente información en su publicación para adivinar lo que está justo aquí.

Cuestiones relacionadas