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.
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)
où path
est votre variable de chemin d'origine et new_suffix
est la chaîne avec votre nouveau suffixe/extension (y compris le "." principal)
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)
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.