Итерация для перемещения файлов в Python - PullRequest
0 голосов
/ 03 июня 2019

У меня проблемы со сложным ходом.У меня есть данные о местах расположения картинок и местах назначения.У меня есть каталог 'train / test / val'.В настоящее время все файлы находятся в каталоге train и в другой папке в соответствии с их классом (всего 28 классов).

Мне нужно переместить 10% каждого класса из каталога train / class в каталог test / class и val / class, оставив 80% файлов, в которых они находятся.

Я использовал следующий код для перемещения всех файлов в папки их классов из одной сплошной папки:

import shutil
import os

if __name__ == '__main__':

    for index, row in labels.iterrows():
        try:
            shutil.move(row['location'], row['destination'])
        except:
            pass

Я бегу к стене, выясняя, как переместить определенное числофайлы в соответствии с их классом.

Ниже приведены данные каждого класса, количество файлов в столбце count и количество файлов, которые нужно переместить в каталог тестирования и каталог проверки в move_count.

import pandas as pd
dic = {'class': ['other_hazard', 'roof', 'front_of_dwelling',
       'address_verification', 'rear_of_dwelling',
       'left_front_of_dwelling', 'right_front_of_dwelling',
       'detached_structure', 'roof_hazard', 'right_side_of_dwelling',
       'left_side_of_dwelling', 'other', 'left_rear_of_dwelling',
       'right_rear_of_dwelling', 'restricted_access', 'opportunity_line',
       'dog_on_premises', 'pool', 'adjacent_exposure', 'apparent_feature',
       'basement', 'hot_tub', 'utl_utc',
       'supplemental_heating_source_(wood_stove)', 'brush',
       'electrical_panel', 'street_sign_(utl)', 'business_exposure'], 'count': [643612, 631651, 441595, 436153, 365357, 275534, 275023, 220917,
       194744, 110098, 109182,  59484,  46058,  45358,  21599,  13753,
         5668,   4586,   3292,   3197,   2899,   2873,   2862,   1994,
         1677,   1392,   1077,   1063], 'move_count': [64361., 63165., 44160., 43615., 36536., 27553., 27502., 22092.,
       19474., 11010., 10918.,  5948.,  4606.,  4536.,  2160.,  1375.,
         567.,   459.,   329.,   320.,   290.,   287.,   286.,   199.,
         168.,   139.,   108.,   106.]}

df_class = pd.DataFrame(dic)

Ниже приведен пример фрейма данных, в котором указано, где находятся файлы и куда мне нужно переместить процент файлов.

 df = {'PictureFilename': ['0091240758-91931712.JPG','0091240791-91646592.JPG', '0091240791-91646593.JPG']
      , 'Target': ['Detached Structure','Address Verification', 'Other']
      , 'location': ['D:\\CIS inspection images 0318\\Photos\\train\\0091240758-91931712.JPG'
                     ,'D:\\CIS inspection images 0318\\Photos\\train\\0091240791-91646592.JPG'
                     ,'D:\\CIS inspection images 0318\\Photos\\train\\0091240791-91646593.JPG']
      ,'test_move_location' : ['D:\\CIS inspection images 0318\\Photos\test\detached_structure'
                               ,'D:\\CIS inspection images 0318\\Photos\\test\\address_verification'
                               ,'D:\\CIS inspection images 0318\\Photos\\test\\other']
      , 'val_move_location': ['D:\\CIS inspection images 0318\\Photos\\val\\detached_structure'
                               ,'D:\\CIS inspection images 0318\\Photos\\val\\address+verification'
                               ,'D:\\CIS inspection images 0318\\Photos\\val\\other']
     }

df_1 = pd.DataFrame.from_dict(df)

У меня проблемы с использованием одного DF для направления другого и выполнения этого движения.Какие-либо предложения?Это то, что я пытался начать с заявления о печати, и оно, похоже, зависло.Я даже не уверен, правильно ли он ведет счет с правильным классом:

for index, row in df_1.iterrows():
    for i, r in df_class.iterrows():
        if row['target'] == r['class']:
            for i in range(1, r['move_count']):
                print(i, row['target'], r['class'])

Хорошо, я нашел способ перебрать кадр данных и распечатать местоположение и место назначения файлов, что означаетЯ могу переместить их.Я не смог выяснить, как остановить движение на определенном количестве файлов.

categories = df_class['class'].unique()

for category in categories:
    n = 0
    for index, row in labels.iterrows():
        if category == row['target']:
            n += 1
            print(n, train_dir+'\\'+row['target']+'\\'+row['PictureFilename'], 'destination: '+ test_dir+'\\'+row['target']+'\\'+row['PictureFilename'])

1 Ответ

0 голосов
/ 04 июня 2019

После многих часов попыток я разобрался с ответом. Ну, ответ. Возможно, есть что-то более эффективное.

#move 10% to test folder
for i, r in label_move_count.iterrows():
    n=0
    for index, row in labels.iterrows():
        if row['target'] == r['target']:
            #n+=1
            if n < row['testcount']:
                try:
                    shutil.move(row['destination']+'\\'+row['PictureFilename'], row['test_destination'])
                    print(n, row['target'])
                    n+=1
                except:
                    pass
        else:
            pass

Я запустил это дважды, чтобы переместить также 10% в папку проверки.

...