[英]Cannot move all files to new folder
我在 Jupyter Notebook 中使用 Python 3 將文件夾中 20% 的文件移動到另一個文件夾,隨機選擇它們。 我的代碼:
path_temp ='/media/Snaps/temp/'
path_valid_break ='/media/Snaps/valid/break/'
files = os.listdir(path_temp)
for x in range(int(len(files)*0.2)):
index = random.randrange(0, len(files))
shutil.move(path_temp + files[index], path_valid_break)
我在初始文件夾中有 1249 個文件。 代碼工作並開始移動文件,但在任意(看起來)數量的文件(35 或 5 或 23,...)后停止並出現錯誤:
~/anaconda3/envs/fastai/lib/python3.6/shutil.py in move(src, dst, copy_function)
540 real_dst = os.path.join(dst, _basename(src))
541 if os.path.exists(real_dst):
--> 542 raise Error("Destination path '%s' already exists" % real_dst)
543 try:
544 os.rename(src, real_dst)
Error: Destination path '/media/Snaps/valid/break/snaps123211_-1.png' already exists
啟動時目標文件夾為空。 代碼並不總是阻塞在同一個文件上,我看不到模式。
除了 Jean-François Fabre 的回答之外,指出您的代碼為每個循環選擇一個隨機數可能很有用,因此您可能試圖復制同一個文件兩次。 為了避免這種情況,您可以改為隨機打亂文件列表並選擇前 20%。
random.shuffle(files)
for thisfile in files[:int(len(files)*0.2)]:
shutil.move(path_temp + thisfile, path_valid_break)
shutil.move
嘗試使用os.rename
,以避免復制然后刪除源(它非常快)。 如果它不起作用(因為不是同一個邏輯單元),那么它會嘗試復制然后刪除源文件。
在這里,目標文件已經存在(來自之前的運行?)。 所以os.rename
因那個特殊原因而失敗(並且不嘗試第二種方法)
如果您不關心目標文件夾中的前一個文件,您可以嘗試刪除該文件(如果存在):
if os.path.exists(path_valid_break):
os.remove(path_valid_break)
shutil.move(path_temp + files[index], path_valid_break)
( remove
可能會失敗,但如果成功, move
命令也會成功)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.