无法将所有文件移动到新文件夹

时间:2018-09-05 19:10:51

标签: python python-3.x

我在Jupyter Notebook中使用Python 3将一个文件夹中20%的文件移动到另一个文件夹,并随机选择它们。我的代码:

public function ajouterSuiviAction(Request $request, $id) {
    $suivi = new Suivi();
    $em = $this->getDoctrine()->getManager();
    $projet = $em->getRepository("CDRProjetBundle:Projet")->find($id);
    $form = $this->get('form.factory')->create(SuiviType::class, $suivi);
    if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($suivi);
        $em->flush();

        return $this->redirectToRoute('cdr_projet_suivi');
    }

    return $this->render('CDRProjetBundle:Projet:ajoutsuivi.html.twig', array(
                'projet' => $projet,
                'form' => $form->createView(),
    ));
}

我的初始文件夹中有1249个文件。该代码可以正常工作并开始移动文件,但是在任意数量(看来是)的文件(35或5或23,...)出现错误后停止:

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)

启动时目标文件夹为空。该代码并不总是阻塞在同一文件上,我看不到任何模式。

2 个答案:

答案 0 :(得分:1)

除了让·弗朗索瓦·法布尔(Jean-FrançoisFabre)的答案外,指出您的代码为每个循环选择一个随机数可能很有用,因此您可能尝试将同一文件复制两次。为避免这种情况,您可以随机随机排列文件列表并选择前20%。

random.shuffle(files)
for thisfile in files[:int(len(files)*0.2)]:
    shutil.move(path_temp + thisfile, path_valid_break)

答案 1 :(得分:0)

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命令也会成功)