2012-04-10 69 views
1

[編輯:見下面的最終代碼]我使用下面的代碼從源目錄中隨機選擇5個文件,然後將它們複製到一個新的目錄。它給了我一個IO錯誤,它表示「沒有這樣的文件或目錄'x'存在」其中「x」是沒有目錄路徑的文件名。不知何故,它不會將路徑存儲在「文件」中。我看着這個論壇以及一個shutil教程,但我無法弄清楚。 (順便說一下,這與我提到的前一個問題類似,但代碼和錯誤發生了變化,當我得到它時,我會將最終代碼發佈到該問題)。提前致謝!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!') 

回答

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

注意,我改變copyfilecopy因爲你指定目的地目錄,而不是一個目標文件。

你也可以添加一個領先r你的字符串之前,使他們raw strings以避免轉義反斜線:

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

但SO語法高亮不喜歡它,所以我把它

+0

不錯!這似乎是一個竅門。現在它告訴我,我沒有寫信給我的目的地的許可,但似乎已經超過了存儲路徑的問題。謝謝! – user1252778 2012-04-10 16:22:25

+0

看我的編輯,我認爲你需要'copy'函數而不是'copyfile'函數。乾杯:-) – jedwards 2012-04-10 16:23:44

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