web-dev-qa-db-fra.com

Ajouter un autre suffixe à un chemin qui en possède déjà un avec pathlib

Je convertissais un ancien code Python pour qu'il utilise pathlib au lieu de os.path pour la plupart des opérations liées aux chemins, mais le problème suivant s'est posé: j'ai eu besoin d'ajouter une autre extension à un chemin qui avait déjà il). Avec os.path, comme nous manipulons simplement des chaînes, la solution consistait à ajouter l'extension avec des opérations sur les chaînes:

newpath = path + '.res'

Cela ne fonctionne pas avec pathlib.Path car il ne permet pas la concaténation de caractères arbitraires. Le plus proche que j'ai pu trouver était le suivant:

newpath = path.with_suffix(path.suffix + '.res')

Cela ressemble à une solution de contournement, car il utilise toujours l’ajout de chaînes à la fin. Et il y a un nouveau piège car j'ai d'abord oublié de gérer le cas où il y a déjà plusieurs extensions et que vous voulez en ajouter une nouvelle, ce qui conduit au code suivant pour récupérer l'ancien comportement:

newpath = path.with_suffix(''.join(path.suffixes) + '.res')

À présent, il ne se sent pas sobre ni net, car il utilise de plus en plus d'opérations de chaîne pour obtenir l'ancien comportement au lieu d'opérations de chemin pur. Le fait que Path.suffixes existe signifie que les développeurs de la bibliothèque ont envisagé le cas où un fichier peut avoir plusieurs extensions, mais je ne pouvais pas trouver un moyen d'ajouter simplement une nouvelle extension à un chemin. Y a-t-il une manière plus idiomatique que j'ai manquée pour obtenir le même comportement?

EDIT: en fait, path.with_suffix(path.suffix + '.res') est suffisant pour traiter le cas où il y a déjà plusieurs extensions de fichier, même si ce n'était pas immédiatement évident pour moi.

19
Morwenn

Il ne semble pas que Path ressemble à une modification sur place (vous ne pouvez pas changer le répertoire .parts[-1] ni le .suffixes, etc.), mais cela ne veut pas dire que vous devez recourir à quelque chose de trop peu recommandable. Ce qui suit fonctionne très bien, même si ce n’est pas aussi élégant que je le souhaiterais:

new_path = path.parent / (path.name + new_suffix)

path est votre variable de chemin d'origine et new_suffix est la chaîne avec votre nouveau suffixe/extension (y compris le "." principal)

3
scnerd

Vous pouvez simplement convertir votre Path en chaîne, puis ajouter une nouvelle extension et reconvertir en Path:

from pathlib import Path
first = Path("D:/user/file.xy")
print(first)
second = Path(str(first)+".res")
print(second)
1
Winand

Le code suivant devrait faire ce que vous voulez d'une manière très dynamique.

from pathlib import Path
import time

p = Path('.')
p = p / '..' / 'Python' / 'Files' / 'Texts_to_read' / 'a_text_file'

new_p = str(p).split('\\')

new_suffix = '.txt'

new_p[-1] = new_p[-1] + new_suffix

p = Path('.')

for x in new_p:
    p = p / x

print(new_p)

print(p)
print(str(p))

time.sleep(5)

Le fait que des opérations de chaîne normales puissent être utilisées dans ce cas est une bonne chose, car cela ajoute beaucoup de contrôle sur le chemin de fichier souhaité sans nécessiter un vaste assortiment de nouvelles fonctions. 

0
S. Mansfield