我在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)
启动时目标文件夹为空。该代码并不总是阻塞在同一文件上,我看不到任何模式。
答案 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
命令也会成功)