1

images拡張子を持つファイル'.png''.jpg'または'jpeg'1 行の for ループで呼び出されるリストを作成しようとしています。論理演算子を使用してこれを試しましたorが、結果は空のリストになりました。

images = [i for i in os.listdir('.') if i[-4:] == ('.png' or '.jpg' or 'jpeg')]

ループの 1 行にすべてを保持しながら、ファイルの最後の 4 文字かどうかを確認するにはどうすればよいです'.png'か?'.jpg''jpeg'

4

6 に答える 6

3

他の回答はinここでの使用を提案していますが、別の方法として次のstr.endswith()方法を使用することをお勧めします。

extensions = '.png', '.jpg', '.jpeg'
images = [i for i in os.listdir('.') if i.endswith(extensions)]

これには、一致をごまかす必要がないという利点があります。.jpeg短い場合にコードを壊すことを心配することなく、任意の長さの拡張子をチェックできます(コードの残りの部分とは別の場所にリストを保存することもできます)。または他のものよりも長い。

于 2012-04-22T12:45:39.723 に答える
2

in次の演算子を使用します。

images = [i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]

さらに良いことに、最後の 4 文字をチェックするだけでなく、次を使用しますos.path.splitext()

images = [i for i in os.listdir('.') if os.path.splitext(i)[1] in ('.png', '.jpg', '.jpeg')]

なぜあなたのコードが機能しなかったのか疑問に思っている場合:('.png' or '.jpg' or 'jpeg') == '.png'それは偽りではない最初の値だからです.

于 2012-04-22T12:16:40.373 に答える
2

あなたが書いたように、pythonは を評価し、結果('.png' or '.jpg' or 'jpeg')と比較i[-4:]します。

おそらく必要なのは、@ ThiefMaster が提案するもの、つまりin演算子です。

于 2012-04-22T12:20:03.477 に答える
1

fnmatchこの目的でモジュールを使用できます。

>>> extensions = ['*.jpg','*.png','*.jpeg']
>>> [file for file in os.listdir(".") for ext in extensions if fnmatch.fnmatch(file,ext)]
['1.png', '2.jpg', '3.jpeg']
于 2012-04-22T12:24:41.650 に答える
0

Usingorは、式のいずれかの値が に評価されるかどうかをチェックするブール式Trueです。

i[-4:] == ('.png' or '.jpg' or 'jpeg')

i[-4:]次と等しいかどうかを評価します。

('.png' or '.jpg' or 'jpeg') 

各値が存在するかどうかを確認し、値がない場合は最初の値または最後の値Trueを返します。この場合、それらはすべて、空の文字列のみが評価されるため、式の結果として評価されます。TrueTrueTrueFalse'.png'

あなたはこれを修正することができます

[i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]

またはより良い方法

[i for i in os.listdir('.') if os.path.splitext(i)[1] in ('.png','.jpg','.jpeg')]
于 2012-04-22T12:33:45.797 に答える
0

式 ('.png' または '.jpg' または 'jpeg') は、実際には最初に '.png' だけに評価され、期待どおりに動作しない可能性があります。

代わりに試すことができます:

images = [i for i in os.listdir('.') if i[-4:] in ('.png', '.jpg', 'jpeg')]
于 2012-04-22T12:20:36.690 に答える