2012-04-10 9 views
1

[編集:最終コードを見てください]以下のコードを使用して、ソースディレクトリからランダムに5つのファイルを選択し、それらを新しいディレクトリにコピーします。それは私に「このようなファイルまたはディレクトリ 'x'が存在しない」というIOエラーを与えています。「x」はディレクトリパスのないファイル名です。何とか "ファイル"にパスを保存していません。私はこのフォーラムだけでなく、シャットルのチュートリアルを見たが、私はそれを把握することはできません。 (btw、これは私が尋ねた以前の質問に似ていますが、コードとエラーが変更されました。前もって感謝します!ファイルのランダム選択/コピーのためのパスを格納していませんか?

import os 
import shutil 
import random 
import os.path 

src_dir = 'C:\\' 
target_dir = 'C:\\Test' 
src_files = (os.listdir(src_dir)) 
def valid_path(dir_path, filename): 
    full_path = os.path.join(dir_path, filename) 
    return os.path.isfile(full_path) 
files = [f for f in src_files if valid_path(src_dir, f)] 
choices = random.sample(files, 5) 
for files in choices: 
    shutil.copyfile(files, target_dir) 
    print ('Finished!') 

答えて

1

あなただけ、あなたが使用していない、完全なパスが有効であるかどうかをテストするためにsrc_dirを使用している

shutil.copyfile(files, target_dir)

を変更

shutil.copyfile(os.path.join(src_dir, files), target_dir)

をお試しくださいもう一度。

編集:あなたが先ディレクトリなく先のファイルを指定したので、私はcopycopyfileを変更し、次の

src_dir = 'C:\\' 
target_dir = 'C:\\Test' 
# Create a list of filenames 
src_files = (os.listdir(src_dir)) 
# Create a list of full paths (valid) 
src_paths = [f for f in [os.path.join(src_dir, f) for f in src_files] if os.path.isfile(f)] 
# Do selection 
choices = random.sample(src_paths, 5) 
for path in choices: 
    print path 
    shutil.copy(path, target_dir) 
    print ('Finished!') 

注意を考えてみましょう。

ます。また、バックスラッシュをエスケープすることを避けるためにそれらraw strings作るためにあなたの文字列の前に大手rを追加することができます。

dir = 'C:\\Temp\\' # Is the same as 
dir = r'C:\Temp\' 

をしかし、私は

それを取ったので、SOの構文ハイライトはそれを好きではありません
+0

ニース!これはトリックを行うように見えました。今私は私の目的地に書き込む許可を持っていないが、それはパスを保存するという問題を過ぎているようだと私に伝えている。ありがとう! – user1252778

+0

私の編集を見て、あなたは 'copy'関数の代わりに' copy'関数が必要だと思います。乾杯:-) – jedwards

1

os.listdir()はファイル名のみを返します。それらにパスを追加するには、os.path.join()を使用する必要があります。

1

src_files = os.listdir(src_dir)とすると、ファイル名の一覧が表示されます。 [f for f in src_files if valid_path()]を列挙し、ファイル名の一覧のみを保持します。

最後にshutil.copyfiles(files, target_dir)になっても、パス全体ではなく、ファイル名のリストだけを引き継いでいます。

files = [os.path.join(src_dir, f) for f in src_files if valid_path(src_dir, f)] 
0

ここで最後に使用したコードがあります。あなたの助けをありがとう!

import os 
import shutil 
import random 
import os.path 

src_dir = 'C:\\' 
target_dir = 'C:\\TEST' 
src_files = (os.listdir(src_dir)) 
def valid_path(dir_path, filename): 
    full_path = os.path.join(dir_path, filename) 
    return os.path.isfile(full_path) 
files = [os.path.join(src_dir, f) for f in src_files if valid_path(src_dir, f)] 
choices = random.sample(files, 5) 
for files in choices: 
    shutil.copy(files, target_dir) 
    print ('Finished!') 
関連する問題