Python Shutil 整数范围内的正则表达式移动文件
Regular expression in Python Shutil integer range to move files
我有一个包含 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 我都需要一个解决方案,但我认为两者都是一样的。
您可以获取所有文件 (*.jpg
),然后为每个文件决定它应该去哪里
import glob
import shutil
import os
dest_dirs = {0:"/tmp/folder1/", 8000:"/tmp/folder2/", 10000:"/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, os.path.join(destination, base))
print(file, os.path.join(destination, base))
except ValueError:
# file name is not a number
pass
我有一个包含 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 我都需要一个解决方案,但我认为两者都是一样的。
您可以获取所有文件 (*.jpg
),然后为每个文件决定它应该去哪里
import glob
import shutil
import os
dest_dirs = {0:"/tmp/folder1/", 8000:"/tmp/folder2/", 10000:"/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, os.path.join(destination, base))
print(file, os.path.join(destination, base))
except ValueError:
# file name is not a number
pass