2017-06-26 2 views
0

私はこのようなデータを持っています。特定の条件を持つ特定のファイルを検索し、別のフォルダ内のすべてのファイルをコピーするpython

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 

を今私が欲しいものです:

私は1つのフォルダにタイプAのすべての画像を載せていきたいと思います。

私はrecord_idを手元に持っており、サブフォルダ(../ 1/1.jpg)という名前の特定のrecord_idを持つフォルダを持っています。したがって、タイプAのすべてのイメージを1つのフォルダにコピーするには、別のフォルダなどに保存されます。

各ファイルの拡張子は次のようにする必要があります:

タイプのために:

.../A/A_ID(すなわち/A/A_2001.jpg,../A/A_2004.jpg

.../B/B_ID(すなわち../B/B_2002.jpg,../B/B_2002_1.jpg)

私はそれを行うにはどうすればよい:Bタイプ用)

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 
+1

実際に試してみてください。あなたはそれがどのように働くべきかあなたの考えを私たちに説明しただけです。 –

+0

タイプC? – glegoux

+0

@ GlegouxはC型と同じです。 – Jitesh

答えて

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) 
+0

実際には動作しません – Jitesh

+0

今は動作しますか? – glegoux

+0

イメージファイル名とrecord_idが異なっていますが、同じと思われていると思いますが、それらは異なっています – Jitesh

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)) 

機能デフ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) 
関連する問題