3 votes

Comment trier les valeurs multiples dans un répertoire par Python

J'ai 540 fichiers dans mon répertoire. Les formats de données de tous les fichiers sont indiqués ci-dessous :

Fichier input.txt

class    confidence    Xmin        Ymin        Xmax           Ymax
7         0.3456900    89          8            39             53
6         0.0123457    2           1            23             43

Fichier result.txt

class    confidence    Xmin        Ymin        Xmax           Ymax
6         0.0123457    2           1            23             43
7         0.3456900    89          8            39             53

J'ai résolu ce problème pour la lecture d'un seul fichier. Le code est donné ci-dessous :

Voici mon code de comparaison de fichiers texte unique. Il fonctionne. Mais j'ai 540 fichiers texte, et je veux trier les fichiers comme ceci. Comment puis-je trier plusieurs fichiers dans mon répertoire par le même processus ? Je dois donner un nom de fichier spécifique à chaque fichier.

from collections import defaultdict 

maxima = defaultdict(int)

with open('F:\GGR\grnd.txt', 'r') as ifh:
    for line in ifh:
        key, value = line.rsplit(None, 1)
        value = int(value)
        if value > maxima[key]:
            maxima[key] = value

with open('output.txt', 'w') as ofh:
    for key in sorted(maxima):
        ofh.write('{} {}\n'.format(key, maxima[key]))

1voto

Patrick Artner Points 29630

Utilisez os.walk pour trouver tous les fichiers de votre répertoire, y compris les sous-répertoires :

Votre code adapté :

from collections import defaultdict 
import os

for root, dirs, files in os.walk(r'F:\GGR'):  # this recurses into subdirectories as well
    for f in files:
        maxima = defaultdict(int)
        try:
            with open(os.path.join(root,f)) as ifh:
                for line in ifh:
                    key, value = line.rsplit(None, 1)
                    value = int(value)
                    if value > maxima[key]:
                        maxima[key] = value

            with open(os.path.join(root, f'{f}.out'), 'w') as ofh:
                for key in sorted(maxima):
                    ofh.write('{} {}\n'.format(key, maxima[key]))
        except ValueError:
            # if you have other files in your dir, you might get this error because they 
            # do not conform to the structure of your "needed" files - skip those
            print(f, "Error converting value to int:", value)

Si vous n'avez pas besoin d'effectuer une récursion dans les sous-répertoires, utilisez la commande os.listdir

Une meilleure solution :

Trier le contenu des fichiers directement à l'aide de la fonction clé argument pour sorted :

from collections import defaultdict 
import os

for root, dirs, files in os.walk(r'./'):
    for f in files:
        print(f)
        maxima = defaultdict(int)
        try:
            with open(os.path.join(root,f)) as ifh, open(
                      os.path.join(root, f'{f}.out'), 'w') as ofh:
                # header
                ofh.write(next(ifh))  
                # data
                ofh.write( '\n'.join(sorted(ifh.readlines(), key = 
                                            lambda x: int(x.split()[-1])))) 
        except ValueError:
            print(f, "Error converting value to int:", ifh)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X