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 Réponses :
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 "-".
Il existe quelques approches ici, en fonction de la variation de vos données:
Essayons donc de construire une méthode get_filename (f)
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.
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]
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.
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 "-".
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
les noms de fichiers auront toujours le -IDENTIFIER, donc je n'ai pas besoin du '.' divisé, mais bon à savoir au cas où.
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