簡體   English   中英

無法將所有文件移動到新文件夾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM