1

[編集: 以下の最終コードを参照] 以下のコードを使用して、ソース ディレクトリから 5 つのファイルをランダムに選択し、それらを新しいディレクトリにコピーしています。「そのようなファイルまたはディレクトリ 'x' は存在しません」という IO エラーが表示されます。ここで、「x」はディレクトリ パスのないファイル名です。どういうわけか、パスを「ファイル」に保存していません。このフォーラムとshutilチュートリアルを見ましたが、わかりません。(ところで、これは私が尋ねた以前の質問に似ていますが、コードとエラーが変更されました。動作するようになったら、その質問に最終的なコードを投稿します)。前もって感謝します!

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!')
4

3 に答える 3

1

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

于 2012-04-10T16:07:48.773 に答える
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)]
于 2012-04-10T16:07:58.650 に答える
1

変更してみる

shutil.copyfile(files, target_dir)

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

src_dirフルパスが有効かどうかをテストするためにのみ使用しており、再度使用することはありません。

編集:以下を検討してください

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!')

宛先ファイルではなく宛先ディレクトリを指定していたため、に変更copyfileしたことに注意してください。copy

バックスラッシュをエスケープする必要がないように、文字列のr前に先頭を追加して生の文字列にすることもできます。

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

でもSOシンタックスハイライターが気に入らないので外しました

于 2012-04-10T16:08:31.023 に答える