2017-09-07 3 views
1

J'ai travaillé ce défi pendant environ un jour. J'ai regardé plusieurs questions et réponses posées sur SO et j'ai essayé de 'MacGyver' le code utilisé pour mon but, mais j'ai toujours des problèmes.Déplacer des paires de fichiers (.txt & .xml) dans leur dossier correspondant en utilisant Python

J'ai un répertoire (appelons-le "src") avec des centaines de fichiers (.txt et .xml). Chaque fichier .txt a un fichier .xml associé (appelons-le une paire). Exemple:

src\text-001.txt 
src\text-001.xml 
src\text-002.txt 
src\text-002.xml 
src\text-003.txt 
src\text-003.xml 

Voici un exemple de la façon dont je voudrais à tourner de sorte que chaque paire de fichiers sont placés dans un seul dossier unique:

src\text-001\text-001.txt 
src\text-001\text-001.xml 
src\text-002\text-002.txt 
src\text-002\text-002.xml 
src\text-003\text-003.txt 
src\text-003\text-003.xml 

Ce que je voudrais faire est de créer un dossier associé pour chaque paire, puis déplacez chaque paire de fichiers dans son dossier respectif en utilisant Python. J'ai déjà essayé de travailler à partir du code que j'ai trouvé (merci à un message de Nov 12 par Sethdd, mais je n'arrive pas à trouver comment utiliser la fonction de déplacement pour récupérer des paires de fichiers.)

import os 
import shutil 

srcpath = "PATH_TO_SOURCE" 
srcfiles = os.listdir(srcpath) 

destpath = "PATH_TO_DEST" 

# grabs the name of the file before extension and uses as the dest folder name 
destdirs = list(set([filename[0:9] for filename in srcfiles])) 


def create(dirname, destpath): 
    full_path = os.path.join(destpath, dirname) 
    os.mkdir(full_path) 
    return full_path 

def move(filename, dirpath): 
    shutil.move(os.path.join(srcpath, filename) 
       ,dirpath) 

# create destination directories and store their names along with full paths 
targets = [ 
    (folder, create(folder, destpath)) for folder in destdirs 
] 

for dirname, full_path in targets: 
    for filename in srcfile: 
     if dirname == filename[0:9]: 
      move(filename, full_path) 

je me sens comme il devrait être facile, mais Python n'est pas quelque chose que je travaille avec tous les jours et il a été un moment depuis que mes jours de script ... Toute aide serait grandement appréciée!

Merci,

WK2EcoD

+0

Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http: // stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. – Prune

Répondre

0

Utilisez le module global e pour interposer tous les fichiers 'txt'. À partir de là, vous pouvez analyser et créer les dossiers et copier les fichiers.

0

Le processus devrait être aussi simple que apparaît pour vous en tant qu'humain.

for file_name in os.listdir(srcpath): 
    dir = file_name[:9] 
    # if dir doesn't exist, create it 
    # move file_name to dir 

Vous faites beaucoup de travail intermédiaire qui semble vous dérouter.

De même, insérez quelques instructions simples print pour suivre le flux de données et le flux d'exécution. Il semble que vous ayez aucune sortie de suivi jusqu'à présent.

0

Vous pouvez le faire avec le module os. Pour chaque fichier dans le répertoire, vérifiez si le dossier associé existe, créez si nécessaire, puis déplacez le fichier. Voir le code ci-dessous:

import os 

SRC = 'path-to-src' 

for fname in os.listdir(SRC): 
    filename, file_extension = os.path.splitext(fname) 
    if file_extension not in ['xml', 'txt']: 
     continue 
    folder_path = os.path.join(SRC, filename) 
    if not os.path.exists(folder_path): 
     os.mkdir(folderpath) 
    os.rename(
     os.path.join(SRC, fname), 
     os.path.join(folder_path, fname) 
    ) 
0

Mon approche serait:

  1. Trouvez les paires que je veux déplacer (ne rien faire avec des fichiers sans une paire)
  2. Créez un répertoire pour chaque paire
  3. Déplacer la paire dans le répertoire
#! /usr/bin/env python 
# -*- coding: utf-8 -*- 

import os, shutil 
import re 

def getPairs(files): 
    pairs = [] 
    file_re = re.compile(r'^(.*)\.(.*)$') 

    for f in files: 
     match = file_re.match(f) 

     if match: 
      (name, ext) = match.groups() 

      if ext == 'txt' and name + '.xml' in files: 
       pairs.append(name) 
    return pairs 

def movePairsToDir(pairs): 

    for name in pairs: 
     os.mkdir(name) 
     shutil.move(name+'.txt', name) 
     shutil.move(name+'.xml', name) 


files = os.listdir() 
pairs = getPairs(files) 

movePairsToDir(pairs) 

REMARQUE: Ce script fonctionne lorsqu'il est appelé dans le répertoire avec les paires.