Usando um arquivo CSV para mover arquivos para diretórios diferentes

3

Eu tenho esse grande diretório de mais de 1000 arquivos de um conjunto de dados de aprendizado de máquina, mas esses arquivos têm qualidades diferentes (fotos de rosas versus daises para mantê-lo simples). Eu tenho este arquivo CSV com os nomes de arquivos de cada um desses itens no conjunto de dados, bem como sua categorização (rosas versus margaridas). Como posso ler este arquivo CSV e dizer ao meu gerenciador de arquivos para mover todas as fotos rosas para um diretório e todas as fotos da margarida para outro diretório? Eu precisaria usar um script Bash, ou isso é algo que já está embutido no Nautilus?

    
por javathunderman 10.12.2016 / 23:26

2 respostas

0

Tudo bem, um amigo e eu conseguimos escrever um script em Python que resolveu isso muito bem.

# Import csv
import csv
# Import os
import os

# Main Function
def main():
# Open dataset file
dataset = open('dataset.csv', newline='')

# Initialize csvreader for dataset
reader = csv.reader(dataset)

# Read data from reader
data = list(reader)

# Variables for progress counter
lines = len(data)
i = 0

# Analyze data in dataset
for row in data:
    # Assign image name and state to variables
    image = row[0] + '.jpeg'
    state = row[1]

    # Print image information
    print('({}/{}) Processing image ({}): {}'.format(i + 1, lines, state, image))

    # Increment i
    i += 1

    # Determine action to perform
    if state is '0':
        # Attempt to move the file
        try:
            # Move the file to nosymptoms/
            os.rename(image, 'nosymptoms/' + image)
            # Inform the user of action being taken
            print(' -> Moved to nosymptoms/')
        except FileNotFoundError:
            # Inform the user of the failure
            print(' -> Failed to find file')
    elif state in ['1', '2', '3', '4']:
        # Attempt to move the file
        try:
            # Move the file to nosymptoms/
            os.rename(image, 'symptoms/' + image)
            # Inform the user of action being taken
            print(' -> Moved to symptoms/')
        except FileNotFoundError:
            # Inform the user of the failure
            print(' -> Failed to find file')

# Execute main function if name is equal to main
if __name__ == '__main__':
main()

Isso tendia a funcionar melhor porque eu tinha mais categorias para lidar ... espero que isso funcione para qualquer pessoa com o mesmo problema.

    
por javathunderman 11.12.2016 / 15:37
0

Aqui está um script bash que deve fazer o que você deseja:

#!/bin/bash

fileNameIndex=0   # set to index of file name
categoryIndex=1   # set to index of category

IFS=",""$IFS"     # add comma to break lines at commas

while read -a tokens;    # read a line and break it into tokens separated by commas
do
    file=${tokens[$fileNmeIndex]}       # get the file name
    category=${tokens[$categoryIndex]}  # get the category
    if [ ! -d $category ]; then         # check if the category directory exists
        mkdir $category;                # make the category directory
    fi
    mv $file $category                  # move the file into the category directory
done

Salve esse script em um arquivo, talvez do_moves.sh, edite-o para definir os valores corretos para fileNameIndex e categoryIndex e, em seguida, execute-o como:

./ do_moves.sh < data.csv

em que data.csv é seu arquivo CSV. Certifique-se de que você não tenha arquivos com o mesmo nome de uma categoria antes de executar isso.

    
por John Anderson 11.12.2016 / 03:36