web-dev-qa-db-ja.com

フォルダー内のファイルをループする

プログラミングに関してはかなり新しく、Pythonの学習を始めました。

私がやりたいのは、ゲームのスプライトの色を変更することです。元の色が与えられ、その後、それらが何に変換されるかが示されます。各スプライトには20〜60の角度があります。したがって、各色のフォルダー内の各スプライトをループするのがおそらく私にとっての方法です。私のコードはこのようになります。

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)

しかし、私はパス名と文字列値であるpixでエラーを取得し続けます(すべての写真です)

任意の助けに感謝します。

33
Firas

os.listdir() は、ファイル名のリストを返します。したがって、filenameは文字列です。繰り返し処理する前にファイルを開く必要があると思います。

また、文字列のバックスラッシュに注意してください。これらは主に特別なエスケープシーケンスに使用されるため、2倍にしてエスケープする必要があります。移植性を高めるために定数_os.sep_を使用するか、またはos.path.join()を使用することもできます。

_folder = os.path.join('C:\\', 'Users', 'Sprinting', 'blue')
_
34
Wookai
for pix in filename:

ファイル名の文字を反復処理します。それは確かにあなたが望むものではありません。その行を次のように置き換えたいと思うでしょう。

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

(Python 2.6)と仮定し、それに応じてループの残りをインデントします。

ただし、forによって現在のファイル内のテキスト行を意味する場合を除き、新しいpixループが目的どおりに動作するかどうかはわかりません。ファイルがバイナリ画像ファイルである場合、最初にその内容を正しく読む必要があります-ここに何があるかを推測するのに十分な情報が投稿にありません。

10
Tim Pietzcker

バックスラッシュを二重にする必要があるため、パスが間違っています-バックスラッシュは特殊文字のエスケープです。

os.listdirは開いているファイルを返さず、ファイル名を返します。ファイル名を使用してファイルを開く必要があります。

3
Mark Ransom