2017-01-02 9 views
1

写真が入っているフォルダがあり、そのフォルダから別のフォルダに写真を移動したいと思います。ファイル:シャッターがすべてのファイルを移動していません

IMAG_01.JPG 
IMAG_02.JPG 
IMAG_03.JPG 
IMAG_04.JPG 
IMAG_05.JPG 
IMAG_06.JPG 
IMAG_07.JPG 
IMAG_08.JPG 
IMAG_09.JPG 

マイコード:

import os.path 
import shutil 
src = '/var/www/html/uploads/' 
dst = '/media/pi/external/Photos/' 
num_files = len([f for f in os.listdir(src)]) 
print(num_files) 
for x in range(num_files): 
    print(x) 
    picture = (os.listdir(src)[x]) 
    print(picture) 
    shutil.move(src+picture,dst+picture) 

私は、コードを実行すると、それはファイルの半分を取り、その後、picture = (os.listdir(src)[x])に私にindex out of rangeエラーを与えます。出力は次のとおりです。

12 
0 
IMAG_04.jpg 
1 
IMAG_07.jpg 
2 
IMAG_01.jpg 
3 
IMAG_02.jpg 
4 
IMAG_09.jpg 
5 
IMAG_08.jpg 
6 
Traceback (most recent call last): 
    File "upload.py", line 11, in <module> 
    picture = (os.listdir(src)[x]) 
IndexError: list index out of range 

私はそれだけで0から始まり、8

に行く必要があるため、xがリストにないですが、それが投げている理由を私は理解していないことを私に言っていることを理解し

答えて

7

あなたは事態を複雑にしています。ファイルを移動しながら、os.listdir()を繰り返し呼び出しています。結果リストは毎回短くなります。

あなたは12名から始めるが、あなたが1を移動したら、あなたは今のディレクトリにのみ11名を取得し、その後、10、そしてあなたのx値が6に当たった時点で、インデックスに通じ0に残された唯一の6名があります5です。したがって、は、IndexError例外で失敗します。

長さは必要ありません。range()を使用する必要はありません。一度os.listdir()、そして結果をループを呼び出します。

import os.path 
import shutil 

src = '/var/www/html/uploads/' 
dst = '/media/pi/external/Photos/' 

for picture in os.listdir(src): 
    print(picture) 
    shutil.move(os.path.join(src, picture), os.path.join(dst, picture)) 

は今、あなたは開始時にすべての名前の一つの完全なリストを持っている、とforループは、それらの名前picture変数に1つずつ割り当てられます。もう一度os.listdir()と呼ぶわけではないので、これらの名前は重要でなくなりました。

+0

迅速な対応をいただき、ありがとうございます。それが私のトリックでした。私のコードを見直した後、私はそれを2回呼び出すことについてあなたが言っていることを正確に見ています。 –

関連する問題