我想创建文件并将文件从一个文件夹移动到另一个文件夹,这样就可以在新创建的文件夹中创建一个新文件夹来创建120个文件。
文件将具有特定的命名结构:X.0.JPEG
,X.1.JEPG
至X.1200.JPEG
例如://path
创建//path//New_folder
在此之后,将在此"New_folder"
下创建文件夹,120个文件将移至"//path//New_folder//F1//(X.0 to X.119)"
旁边的新文件夹"//path//New_folder//F2//(X.120 to X.239)"
...
这是我目前的代码,问题是它随机移动文件。
import os, os.path, shutil
folder = './path'
images = [
filename
for filename in os.listdir(folder)
if os.path.isfile(os.path.join(folder, filename))
]
global no
no = int(len(images)/120) + 1
img1 = images[0]
global folderName
folderName = img1.split('.')[0]
newDir = os.path.join(folder, folderName)
global folderCount
folderCount = 0
if not os.path.exists(newDir):
os.makedirs(newDir)#folder created
folderLimit = 120
global imageCount
imageCount = 0
for image in images:
if imageCount == folderLimit:
imageCount = 0
if imageCount == 0:
folderCount = folderCount + 1
newfoldername = os.path.join(newDir, folderName + '(' + str(folderCount) + ')' )
os.makedirs(newfoldername)
existingImageFolder = os.path.join(folder, image)
new_image_path = os.path.join(newfoldername, image)
shutil.move(existingImageFolder, new_image_path)
imageCount = imageCount + 1
答案 0 :(得分:0)
这种“随机性”的原因是os.listdir(folder)
如何工作 - 它以随机顺序返回文件名。 From documentation:
os.listdir(path)
返回一个列表,其中包含path给出的目录中的条目名称。 列表按任意顺序排列。它不包含特殊条目
'.'
和'..'
,即使它们存在于目录中。
因此,您需要做的是对os.listdir
返回的结果进行排序。
import os, os.path, shutil
folder = './path'
lis_dir = [f for f in os.listdir(folder) if ('.' in f and f.split('.')[1].isnumeric())]
images = sorted(lis_dir, key=lambda x: int(x.split('.')[1]))
folderLimit = 120
folderName = images[0].split('.')[0]
newDir = os.path.join(folder, folderName)
folderCount = 0
if not os.path.exists(newDir):
os.makedirs(newDir)#folder created
for imageCount, image in enumerate(images):
if (imageCount % folderLimit) == 0:
folderCount += 1
newfoldername = os.path.join(newDir, folderName + '(' + str(folderCount) + ')' )
os.makedirs(newfoldername)
existingImageFolder = os.path.join(folder, image)
new_image_path = os.path.join(newfoldername, image)
shutil.move(existingImageFolder, new_image_path)