Python:将文件移动到新创建的目录

Python:将文件移动到新创建的目录,python,filesystems,shutil,Python,Filesystems,Shutil,我已经让我的脚本创建了一堆文件(大小取决于输入),我希望根据文件名在特定文件夹中创建特定文件 到目前为止,我已经得到了以下信息,但尽管创建了目录,但没有移动任何文件,我不确定最终for循环中的逻辑是否有意义 在下面的代码中,我试图将所有以_01结尾的.png文件移动到sub_frame_0文件夹中 此外,它们还以某种方式增加文件结尾_01到_02等,以及destn文件夹,即从sub_frame_0到sub_frame_1到sub_frame_2等等 for index, i in enumera

我已经让我的脚本创建了一堆文件(大小取决于输入),我希望根据文件名在特定文件夹中创建特定文件

到目前为止,我已经得到了以下信息,但尽管创建了目录,但没有移动任何文件,我不确定最终for循环中的逻辑是否有意义

在下面的代码中,我试图将所有以_01结尾的.png文件移动到sub_frame_0文件夹中

此外,它们还以某种方式增加文件结尾_01到_02等,以及destn文件夹,即从sub_frame_0到sub_frame_1到sub_frame_2等等

for index, i in enumerate(range(num_sub_frames+10)):
    path = os.makedirs('./sub_frame_{}'.format(index))

# Slice layers into sub-frames and add to appropriate directory

list_of_files = glob.glob('*.tif')
for fname in list_of_files: 
    image_slicer.slice(fname, num_sub_frames) # Slices the .tif frames into .png sub-frames

list_of_sub_frames = glob.glob('*.png')
for i in list_of_sub_frames:
    if i == '*_01.png':
        shutil.move(os.path.join(os.getcwd(), '*_01.png'), './sub_frame_0/')

一个简单的修复方法是检查文件名
i
中是否有'*_01.png',并将
shutil.move
更改为包含文件名
i
。(同样值得一提的是,
i
不是文件路径的好名称

list_of_sub_frames = glob.glob('*.png')
for i in list_of_sub_frames:
    if '*_01.png' in i:
    shutil.move(os.path.join(os.getcwd(), i), './sub_frame_0/')
此外,[有办法]增加文件结尾_01到_02等,以及destn文件夹,即从sub_frame_0到sub_frame_1到sub_frame_2等等

for index, i in enumerate(range(num_sub_frames+10)):
    path = os.makedirs('./sub_frame_{}'.format(index))

# Slice layers into sub-frames and add to appropriate directory

list_of_files = glob.glob('*.tif')
for fname in list_of_files: 
    image_slicer.slice(fname, num_sub_frames) # Slices the .tif frames into .png sub-frames

list_of_sub_frames = glob.glob('*.png')
for i in list_of_sub_frames:
    if i == '*_01.png':
        shutil.move(os.path.join(os.getcwd(), '*_01.png'), './sub_frame_0/')
您可以通过以下简单操作创建文件名:

for i in range(10):
    #simple string parsing
    file_name = 'sub_frame_'+str(i)
    folder_name = 'folder_sub_frame_'+str(i)

正如您所说,最终循环的逻辑没有意义

if i == '*_01.ng'
它的计算结果类似于
'image\u 01.png'='*\u 01.png'
,并且始终为false

Regexp应该是一种方法,但是对于这个简单的例子,您只需要从文件名中分割数字

for i in list_of_sub_frames:
    frame = int(i[-6:-4]) - 1
    shutil.move(os.path.join(os.getcwd(), i), './sub_frame_{}/'.format(frame))

如果
i='image\u 01.png'
那么
i[-6:-4]
将取'01',将其转换为整数,然后减去1以遵循您的模式。

下面是一个使用正则表达式的完整示例。这还实现了文件名/目标文件夹的递增

import os
import glob
import shutil
import re

num_sub_frames = 3
# No need to enumerate range list without start or step
for index in range(num_sub_frames+10):
    path = os.makedirs('./sub_frame_{0:02}'.format(index))

# Slice layers into sub-frames and add to appropriate directory

list_of_files = glob.glob('*.tif')
for fname in list_of_files:
    image_slicer.slice(fname, num_sub_frames) # Slices the .tif frames into .png sub-frames

list_of_sub_frames = glob.glob('*.png')
for name in list_of_sub_frames:
    m = re.search('(?P<fname>.+?)_(?P<num>\d+).png', name)
    if m:
        num = int(m.group('num'))+1
        newname = '{0}_{1:02}.png'.format(m.group('fname'), num)
        newpath = os.path.join('./sub_frame_{0:02}/'.format(num), newname)
        print m.group() + ' -> ' + newpath
        shutil.move(os.path.join(os.getcwd(), m.group()), newpath)
导入操作系统
导入glob
进口舒蒂尔
进口稀土
num_sub_frames=3
#无需在没有开始或步骤的情况下枚举范围列表
对于范围内的索引(num_sub_frames+10):
path=os.makedirs('./子帧{0:02}'。格式(索引))
#将层切片为子帧并添加到适当的目录中
文件列表=glob.glob('*.tif')
对于\u文件列表\u中的fname:
image_slicer.slice(fname,num_sub_frames)#将.tif帧分割成.png子帧
子帧列表=glob.glob('*.png')
对于子框架列表中的名称:
m=重新搜索('(?P.+?)(?P\d+).png',名称)
如果m:
num=int(m.group('num'))+1
newname='{0}{1:02}.png'。格式(m.group('fname'),num)
newpath=os.path.join('./sub_frame{0:02}/'.format(num),newname)
打印m.group()+'->'+newpath
move(os.path.join(os.getcwd(),m.group()),newpath)

您是否正在尝试移动一个名为
[path]\*\u 01.png的文件?您是否检查了要移动的文件的名称?文件名不能包含“*”。
i='*\u 01.png'
是一种文字搜索(即,我必须精确地为
'*\u 01.png'
,它才能工作)。如果您正试图这样做,它将不会对文件进行全局化。事实上,
如果i='*\u 01.png':
没有意义。
i
将包含一个实际的文件名,我想它不会是'*\u 01.png'。MichalFrystacky我正在尝试移动所有以*\u 01.png结尾的文件。@vanocpenther我很高兴它起作用。别忘了接受answer.:)