it-swarm.com.de

Verwenden einer CSV-Datei zum Verschieben von Dateien in verschiedene Verzeichnisse

Ich habe dieses große Verzeichnis mit mehr als 1000 Dateien aus einem maschinellen Lerndatensatz, aber diese Dateien haben unterschiedliche Qualitäten (Bilder von Rosen vs. Margeriten, um es einfach zu halten). Ich habe diese CSV-Datei mit den Dateinamen der einzelnen Elemente im Datensatz sowie deren Kategorisierung (Rosen vs. Gänseblümchen). Wie kann ich diese CSV-Datei lesen und meinem Dateimanager mitteilen, dass alle Rose-Fotos in ein Verzeichnis und alle Daisy-Fotos in ein anderes Verzeichnis verschoben werden sollen? Muss ich ein Bash-Skript verwenden, oder ist dies bereits in Nautilus integriert?

2
javathunderman

Okay, ein Freund und ich haben es geschafft, ein Skript in Python zu schreiben, das das ziemlich gut gelöst hat.

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

Dies funktionierte tendenziell besser, da ich mehr Kategorien zu bewältigen hatte ... hoffentlich funktioniert dies für alle, die das gleiche Problem haben.

0
javathunderman

Hier ist ein Bash-Skript, das tun sollte, was Sie wollen:

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

Speichern Sie dieses Skript in einer Datei, vielleicht do_moves.sh, bearbeiten Sie es, um die korrekten Werte für fileNameIndex und categoryIndex festzulegen, und führen Sie es dann wie folgt aus:

./do_moves.sh <data.csv

dabei ist data.csv Ihre CSV-Datei. Stellen Sie sicher, dass Sie keine Dateien haben, die den gleichen Namen wie eine Kategorie haben, bevor Sie diese ausführen.

0
John Anderson