web-dev-qa-db-fra.com

Utiliser un fichier CSV pour déplacer des fichiers dans différents répertoires

J'ai ce grand répertoire de plus de 1000 fichiers d'un jeu de données d'apprentissage automatique, mais ces fichiers ont des qualités différentes (des images de roses ou de pâles pour rester simple). J'ai ce fichier CSV avec les noms de fichier de chacun de ces éléments dans le jeu de données, ainsi que leur catégorisation (roses vs marguerites). Comment lire ce fichier CSV et dire à mon gestionnaire de fichiers de déplacer toutes les photos de rose dans un répertoire et toutes les photos de marguerite dans un autre répertoire? Aurais-je besoin d'un script Bash ou s'agit-il déjà de quelque chose qui est déjà intégré à Nautilus?

2
javathunderman

Bon, un ami et moi avons réussi à écrire un script dans Python qui a très bien résolu le problème.

# 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 __== '__main__':
main()

Cela fonctionnait mieux parce que j'avais plus de catégories à gérer ... espérons que cela fonctionnera pour tous ceux qui ont le même problème.

0
javathunderman

Voici un script bash qui devrait faire ce que vous voulez:

#!/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

Enregistrez ce script dans un fichier, peut-être do_moves.sh, modifiez-le pour définir les valeurs correctes pour fileNameIndex et categoryIndex, puis exécutez-le en tant que:

./do_moves.sh <data.csv

où data.csv est votre fichier CSV. Assurez-vous de ne pas avoir de fichier portant le même nom qu'une catégorie avant de l'exécuter.

0
John Anderson