在python中复制和更改文件名

问题描述 投票:0回答:1

我有一个名为“ID”的目录,它有多个子目录,如“12”,“2”,“30”,“24”等。每个子目录再次在其中有子目录,就像例如12有子其中的目录名为“1port_50”,“1port_60”,“1port_80”,“3port_100”,“log”,“root”。

现在,这些子目录“1port_50”在其中有多个图像(.jpg)文件,名为“xyz_2018.jpg,pqd_201.jpg”,“1port_60”有foo_174.jpg,bar_142.jpg,foobar_73.jpg等等。除了目录“log”,“root”(这两个文件夹不包含任何内容和要丢弃的id)。

我想做的是

1)进入目录“12”并计算每种类型端口的出现次数

2)进入“1port_50”内的每个“port”目录文件内部并检查图像文件的数量

3)在其他位置创建一个名为“1port_1”的目录,例如“D:/ Files / 1port_1”,并复制1port_abc文件夹内的所有图像文件,并将这些图像文件重命名为xyz_1.jpg,pqd_2.jpg(因为只有两个图像,这就是为什么* _1和* _2)

4)再次进入目录“1port_60”检查图像文件的数量,在位置“D:/ Files /”创建另一个文件夹“1port_2”并重命名图像文件foo_1.jpg,bar_2.jpg,foobar_3.jpg(因为有1port_60内的3个.jpg文件,因此将它们重命名为_1,_2,* _ 3。)

5)对“ID”目录中的所有目录重复相同的过程。这是我尝试但未通过的代码

所以最后目录应该是这样的。

  D->Files->1port_1->xyz_1.jpg, pqd_2.jpg
  D->Files->1port_2->foo_1.jpg, bar_2.jpg, foobar_3.jpg
  D->Files->1port_3->ab_1.jpg, aar_2.jpg, qerr_3.jpg
  D->Files->3port_1->poi_1.jpg

import os
folder_list =os.listdir("D:/ID")
folder_list_prev = [e for e in folder_list if e not in ('log','root')]
folder_list = [x.rsplit('_',1)[0] for x in folder_list_prev]
distElementList=list(set(folder_list))
ty=[]
freq=[]

for v,k in Counter(folder_list).items():
  ty.append(v)
  freq.append(k)

for i in range(0,len(folder_list_prev)):
  for n in range(0,len(freq)):
    for m in range(1,freq[n]+2):
      os.makedirs(("D:\\Files\\"+folder_list_prev[m-1].split('_')[0]+"_"+str(m)))
      img_inside_dir = [f for f in os.listdir(('D:/ID/12'+folder_list_prev[m-1])) if f.endswith('.jpg')]

      for j in range(0,len(img_inside_dir)):
        copyfile('D:/ID/12'+folder_list_prev[m-1]+'/'+img_inside_dir[j],'D:Files/'+folder_list_prev[m-1].split('_')[0]+'_'+str(m)+'/'+img_inside_dir[j])

在这里,我试图只为一个ID,即12。

关于如何实现这一点的任何建议。

python list for-loop directory file-copying
1个回答
0
投票

我不太了解您希望最终存储图像的新目录的命名约定中的逻辑,但这里是一个如何使用os.walk()的示例。您必须实现其余逻辑以满足您的需求。

import os

start_dir = "/Users/jonas/testing/port_test/ID"

all_image_files = []
"""
all_image_files is a list of objects representing each image file on the following format:
{
    "parent_directory": path_to_parent_directory,
    "image_filename": name of image file
}
"""
print "Finding image files."
for root, dirs, files in os.walk(start_dir):
    # Find image files
    image_files = [f for f in files if f.endswith(".jpg")]
    if len(image_files) == 0:
        print "No image files in the current directory (%s)" % root
    else:
        print "Found image files in %s: %s" % (root, image_files)
        # Loop through images and save them to the all_image_files list
        for i in image_files:
            all_image_files.append({
                "parent_directory": root,
                "image_filename": i
            })

# Now you can do whatever logit it is that you need.
# I didn't quite understand what you wanted, so this
# just prints the objects.
print "\n====== Images found ======"
for image_object in all_image_files:
    print "Parent directory:", image_object["parent_directory"]
    print "Image filename:", image_object["image_filename"]
    print "Full path to image:", os.path.join(image_object["parent_directory"], image_object["image_filename"])
    print "--------------------------------------------------"

这打印,我的示例目录结构,这:

Finding image files.
No image files in the current directory (/Users/jonas/testing/port_test/ID)
No image files in the current directory (/Users/jonas/testing/port_test/ID/12)
Found image files in /Users/jonas/testing/port_test/ID/12/1port_50: ['hello2.jpg', 'hello3.jpg', 'hello.jpg']
Found image files in /Users/jonas/testing/port_test/ID/12/1port_60: ['hello2.jpg', 'hello3.jpg', 'hello1.jpg']
Found image files in /Users/jonas/testing/port_test/ID/12/1port_70: ['hello1.jpg']
No image files in the current directory (/Users/jonas/testing/port_test/ID/2)
Found image files in /Users/jonas/testing/port_test/ID/2/1port_100: ['hello2.jpg', 'hello3.jpg', 'hello1.jpg']

====== Images found ======
Parent directory: /Users/jonas/testing/port_test/ID/12/1port_50
Image filename: hello2.jpg
Full path to image: /Users/jonas/testing/port_test/ID/12/1port_50/hello2.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/12/1port_50
Image filename: hello3.jpg
Full path to image: /Users/jonas/testing/port_test/ID/12/1port_50/hello3.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/12/1port_50
Image filename: hello.jpg
Full path to image: /Users/jonas/testing/port_test/ID/12/1port_50/hello.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/12/1port_60
Image filename: hello2.jpg
Full path to image: /Users/jonas/testing/port_test/ID/12/1port_60/hello2.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/12/1port_60
Image filename: hello3.jpg
Full path to image: /Users/jonas/testing/port_test/ID/12/1port_60/hello3.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/12/1port_60
Image filename: hello1.jpg
Full path to image: /Users/jonas/testing/port_test/ID/12/1port_60/hello1.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/12/1port_70
Image filename: hello1.jpg
Full path to image: /Users/jonas/testing/port_test/ID/12/1port_70/hello1.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/2/1port_100
Image filename: hello2.jpg
Full path to image: /Users/jonas/testing/port_test/ID/2/1port_100/hello2.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/2/1port_100
Image filename: hello3.jpg
Full path to image: /Users/jonas/testing/port_test/ID/2/1port_100/hello3.jpg
--------------------------------------------------
Parent directory: /Users/jonas/testing/port_test/ID/2/1port_100
Image filename: hello1.jpg
Full path to image: /Users/jonas/testing/port_test/ID/2/1port_100/hello1.jpg
--------------------------------------------------
© www.soinside.com 2019 - 2024. All rights reserved.