搜索具有特定条件的某些文件,并复制另一个文件夹python中的所有文件

时间:2017-06-26 09:44:42

标签: python pandas

我有这样的数据;

id      record_id    Type
2001     1           A
2002     2           B
2002     3           B
2004     4           A
2004     5           A
2005     6           C
2006     7           A
2007     8           A

以上数据位于数据框中。

我有这样的文件夹:

E:/Files/Data/2001/1/1.jpg
E:/Files/Data/2002/2/1.jpg
E:/Files/Data/2002/3/2.jpg
E:/Files/Data/2004/4/1.jpg
E:/Files/Data/2004/5/2.jpg
E:/Files/Data/2005/6/1.jpg
E:/Files/Data/2006/7/1.jpg

现在我想要的是:

我想将A类型的所有图像放在一个文件夹中。

现在我手边有一个record_id,并且我有一个文件夹,其中特定的record_id被命名为子文件夹(../ 1 / 1.jpg),那么如何将所有类型A的图像复制到一个文件夹中,键入B in另一个文件夹等等。

每个文件的扩展名应如下所示:

表示A类型:

... / A / A_id(即/A/A_2001.jpg,../ A / A_2004.jpg)

表示B型:

... / B / B_id(即../ B / B_2002.jpg,.. / B / B_2002_1.jpg)

我如何在python中完成?

这是我到目前为止所尝试的:

import os
import pandas as pd
rootdir = 'E:Files/user_data'
output_path="E:/Files/Test_Folder/"
subdir1=[]
path=[]
for dirpath,subdir,filename in sorted(os.walk(rootdir)):
    subdir1.append(subdir)
    path.append(dirpath)

L=filter(None,subdir1)
del L[0]
Record_ids=[r_id for ids in L for r_id in ids]
User_records=pd.read_csv("User_records.csv")
records_data=User_records[["id",'recordId','recordType']]
A=records_data[records_data['recordType']=='A']

cnt=0
for dirpath,subdir,files in os.walk(rootdir):
    for ids in A['recordId']:
        for file in files:
            for r_id in Record_ids:
                if ids==r_id:
                    os.rename(os.path.join(dirpath,file),output_path+'A_'+str(cnt)+'.jpg')
                    cnt=cnt+1

2 个答案:

答案 0 :(得分:0)

<强> FILE.CSV

id,record_id,Type
2001,1,A
2002,2,B
2002,3,B
2004,4,A
2004,5,A
2005,6,C
2006,7,A
2007,8,A

执行:

import os
from shutil import copyfile

import pandas as pd

rootdir = 'E:Files/user_data'
output_path = 'E:/Files/Test_Folder/'


def path_source_img(_id, record_id):
    global rootdir
    return os.path.join(rootdir, str(_id), '{}.jpg'.format(record_id))


def path_dest_img(_type, _id, record_id):
    global output_path
    return os.path.join(output_path, _type,
                        '{}_{}_{}.jpg'.format(_type, _id, record_id))


df = pd.read_csv('file.csv')

if not os.path.exists(output_path):
    os.makedirs(os.path.dirname(output_path))

for _type in df['Type'].unique():
    imgs = df[df['Type'] == _type]
    for index, img in imgs.iterrows():
        from_img = path_source_img(img['id'], img['record_id'])
        to_img = path_dest_img(_type, img['id'], img['record_id'])
        print(from_img, '->', to_img)
        if not os.path.exists(output_path):
            os.makedirs(os.path.dirname(to_img))
        copyfile(from_img, to_img)

答案 1 :(得分:0)

我尝试了类似的东西,并根据我的要求进行了一些修改。

import os
from shutil import copyfile
import pandas as pd

rootdir = 'Mention the root directory here'
output_path = 'Mention the output path'
df = pd.read_csv('mention the path to the csv file')

如果图像名称是数字格式,请使用此

df['id'] = df['id'].astype('str') 


def path_source_img(_id, record_id):
    global rootdir
    return os.path.join(rootdir, str(_id), '{}.jpg'.format(record_id))

def path_dest_img(_type, _id, record_id):
    global output_path
    return os.path.join(output_path, _type,
                        '{}.jpg'.format(record_id))
如果需要,

函数def ensure_dir将创建文件夹,如果目标路径中的文件夹不可用

def ensure_dir(file_path):
    directory = os.path.dirname(file_path)
    if not os.path.exists(directory):
        os.makedirs(directory)

for _type in df['Type'].unique():
imgs = df[df['Type'] == _type]
for index, img in imgs.iterrows():
    from_img = path_source_img(img['id'], img['record_id'])
    to_img = path_dest_img(_type, img['id'], img['record_id'])
    from_img = '/'.join(from_img.split('\\'))
    to_img = '/'.join(to_img.split('\\'))
    print(from_img, '->', to_img)
    ensure_dir(to_img)
    copyfile(from_img, to_img)