我有一个文件夹,里面有12500张图片。 文件名包含数字,因此类似于:
0.jpg
1.jpg
2.jpg
3.jpg
.
.
.12499.jpg
现在我要移动文件。 范围为0-7999的文件应复制到第一个文件夹。 文件8000-9999应复制到第二个文件夹,范围10000-12499的文件应复制到第三个文件夹。
首先,我认为我可以很容易地将[0-7999].jpg用于第一个文件夹,[8000-9999].jpg用于第二个文件夹,[10000-12499].jpg用于第三个文件夹。 然而,这并不奏效。 根据我知道的通配符,我算出了下面的代码? 和*:下面的代码确实起作用,并且完成了这项工作(请注意,我注释掉了shutil.copy,而是使用print来检查结果):
import glob
import shutil
dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/?.jpg'):
#shutil.copy(file, dest_dir)
print(file)
dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/??.jpg'):
#shutil.copy(file, dest_dir)
print(file)
dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/???.jpg'):
#shutil.copy(file, dest_dir)
print(file)
dest_dir = "/tmp/folder1/"
for file in glob.glob('/tmp/source/[1-7]???.jpg'):
#shutil.copy(file, dest_dir)
print(file)
dest_dir = "/tmp/folder2/"
for file in glob.glob('/tmp/source/[8-9]???.jpg'):
#shutil.copy(file, dest_dir)
print(file)
dest_dir = "/tmp/folder3/"
for file in glob.glob('/tmp/source/?????.jpg'):
#shutil.copy(file, dest_dir)
print(file)
然而,我希望有一个优雅的解决方案。 我在谷歌上搜索了整数范围的正则表达式,并尝试了以下操作:
dest_dir = "/tmp/folder3/"
for file in glob.glob('/tmp/source/\b([0-9]|[1-9][0-9]|[1-9][0-9][0-9]|1000).jpg'):
#shutil.copy(file, dest_dir)
print(file)
这不起作用。 那么一个正确的实现是怎样的呢? 我都需要一个解决方案,shutil.copy和shutil.move,但我认为这两者都是一样的。
试试这个,
import os
for file_name in os.listdir("path"):
file_ = int(file_name.split(".")[0])
if file_ <= 7999:
print("first folder")
elif 8000 <= file_ <= 9999:
print("second folder")
elif 10000 <= file_ <= 12499:
print("third folder")
您可以获取所有文件(*.jpg
),然后决定每个文件的位置
import glob
import shutil
import os
dest_dirs = {0:"/tmp/folder1/", 8000:"/tmp/folder2/", 12000:"/tmp/folder3/"}
for file in glob.glob('*.jpg'):
base = os.path.basename(file) # remove path
withoutext = os.path.splitext(base)[0] # remove extension
try:
number = int(withoutext)
for key, value in dest_dirs.items():
if number >= key:
destination = value
# shutil.copy(file, dest_dir)
print(file, destination)
except:
pass