1
votes

Essayer de trouver un moyen de filtrer les parties d'une chaîne python

J'essaie de filtrer les chaînes dans les noms de fichiers qui apparaissent dans une boucle for

if search == "List":
        onlyfiles = [f for f in listdir("path") if isfile(join("path", f))]
        for i in onlyfiles:
            print(i)

maintenant, il affichera tous les noms de fichiers, comme prévu et souhaité, mais je veux filtrer le .json à la fin du fichier ainsi que quelques autres éléments dans le nom du fichier pour que je puisse juste voir le nom du fichier.

Par exemple: filename-IDENTIFIER.json Je veux filtrer "-IDENTIFIER.json" de la sortie de la boucle for

Merci pour toute aide


3 commentaires

Quel est le format de IDENTIFIER ?


S'il a toujours un tiret, vous pouvez diviser le nom du fichier en utilisant le tiret comme séparateur.


@meowgoesthedog cela peut être un nombre ou des lettres ou une combinaison


3 Réponses :


0
votes

Divisez la chaîne sur "-" et obtenez le premier élément:

filename = f.split("-")[0]

Cela va être dérangé si le nom du fichier contient "-".


0 commentaires

2
votes

Il existe quelques approches ici, en fonction de la variation de vos données: Essayons donc de construire une méthode get_filename (f)

Rapide et sale

Si vous savez que f se termine toujours exactement de la même manière , alors vous pouvez directement essayer de supprimer ces caractères. Nous devons donc ici supprimer les 16 derniers caractères. Il est utile de savoir qu'en Python, une chaîne peut être considérée comme un tableau (immuable) de caractères, vous pouvez donc également utiliser l'indexation de liste.

get_filename(f: str):
    return "-".join(f.split("-")[:-1])

Cela échouera cependant si l'identifiant ou le suffixe change de longueur.

Différentes longueurs

Si le suffixe change en fonction de la longueur, alors vous devez diviser la chaîne sur un délimiteur fixe et renvoyer la partie appropriée. Dans ce cas, vous souhaitez fractionner sur - .

get_filename(f: str):
    return f.split("-")[0]

Notez cependant que cela échouera si le nom de fichier contient également un - code>. Vous pouvez résoudre ce problème en supprimant la dernière partie et en rejoignant toutes les pièces précédentes, de la manière suivante.

get_filename(f: str):
    return f[:-16]

Utilisation des expressions régulières pour correspondre au format

Le l'approche la plus générale serait d'utiliser python regexes pour sélectionner la partie appropriée. Celles-ci vous permettent de cibler très spécifiquement un modèle spécifique. Le regex exact dont vous aurez besoin dépendra de la complexité de vos chaînes.


2 commentaires

donc en utilisant cette technique, le nom de fichier ne peut contenir qu'un seul "-", correct?


C'est le cas, mais j'ai ajouté une autre manière de traiter plusieurs "-".



0
votes

Cela devrait fonctionner:

i.split('-IDENTIFIER')[0].split('.json')[0]

Cas 1 : filename-IDENTIFIER.json

Il faut le sous-chaîne avant le tiret, donc la sortie deviendra filename

Cas 2 : filename.json

Il n'y a pas de tiret dans la chaîne, donc la première division ne fait rien (la chaîne complète sera dans le 0ème élément), puis elle prend la sous-chaîne avant le point. La sortie sera filename

Cas 3 : filename

Rien à diviser, la sortie sera filename

Si c'est toujours .json et -IDENTIFIER , alors il est plus sûr d'utiliser ceci:

XXX

Cas 4 : filename-blabla.json

Si le nom de fichier contient un tiret supplémentaire, il ne sera pas un problème, la sortie sera filename-blabla


1 commentaires

les noms de fichiers auront toujours le -IDENTIFIER, donc je n'ai pas besoin du '.' divisé, mais bon à savoir au cas où.