Pregunta Looping a través de archivos en una carpeta


Soy bastante nuevo en lo que respecta a programación, y he comenzado a aprender Python.

Lo que quiero hacer es recolour sprites para un juego, y me dan los colores originales, seguidos de lo que se convertirán. Cada sprite tiene entre 20 y 60 ángulos, por lo que un bucle a través de cada uno en la carpeta para cada color es probablemente el camino a seguir 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 sigo recibiendo un error en la ruta de acceso, y en pix siendo un valor de cadena (Son todas las imágenes)

Cualquier ayuda apreciada.


32
2017-11-24 19:19


origen


Respuestas:


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

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

folder = os.path.join('C:\\', 'Users', 'Sprinting', 'blue')

34
2017-11-24 19:24



for pix in filename:

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

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

(asumiendo Python 2.6) y sangrar el resto del ciclo en consecuencia.

Sin embargo, no estoy seguro de que el nuevo for loop hace lo que quieras a menos que pix te refieres a 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í.


10
2017-11-24 19:28



La ruta es incorrecta porque las barras diagonales inversas deben duplicarse: la barra invertida 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.


3
2017-11-24 19:24