我有这样的数据;
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
答案 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)