web-dev-qa-db-ja.com

既にpathlibのサフィックスがあるパスに別のサフィックスを追加する

私はいくつかの古いPythonコードを pathlib の代わりに使用して、ほとんどのパス関連の操作に_os.path_を使用していましたが、次の問題:既に拡張子を持っているパスに別の拡張子を追加する必要がありました(置き換えるのではなく)_os.path_では、単に文字列を操作するだけなので、解決策は文字列操作で拡張子を追加することでした:

_newpath = path + '.res'
_

_pathlib.Path_では機能しません。これは、任意の文字を連結できないためです。私が見つけた最も近いものは次のとおりでした:

_newpath = path.with_suffix(path.suffix + '.res')
_

最後に文字列の追加を使用するため、回避策のように見えます。そして、既にいくつかの拡張機能があり、新しい拡張機能を追加したい場合に対処するのを忘れていたため、新しい落とし穴があり、次のコードが古い動作を取り戻すことにつながります。

_newpath = path.with_suffix(''.join(path.suffixes) + '.res')
_

今では、純粋なパス操作ではなく、より多くの文字列操作を使用して古い動作を実現しているため、簡潔でもクリーンでもありません。 _Path.suffixes_が存在するという事実は、ライブラリの開発者がファイルに複数の拡張子を付けることができる場合を検討したが、パスに新しい拡張子を単純に追加する方法が見つからなかったことを意味します。同じ行動を達成するのを逃した、より慣用的な方法はありますか?

編集:実際にはpath.with_suffix(path.suffix + '.res')は、私にはすぐには明らかではなかったが、すでにいくつかのファイル拡張子がある場合を処理するのに十分です。

25
Morwenn

Pathがその場で変更されるようなものではないようです(変更できません.parts[-1]ディレクトリまたは変更.suffixesなど)、しかし、それはあなたがあまりにも不味いものに頼る必要があるという意味ではありません。私が望むほどエレガントではない場合でも、次のようにうまく機能します:

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

ここで、pathは元のパス変数であり、new_suffixは、新しいサフィックス/拡張子(先頭の「。」を含む)を含む文字列です

5
scnerd

Pathを文字列に変換してから、新しい拡張子を追加し、Pathに戻すことができます。

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

次のコードは、非常に動的な方法で必要な処理を行う必要があります。

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)

この場合、通常の文字列操作を使用できるという事実は、多くの新しい関数を必要とせずに、必要なファイルパスを大幅に制御できるため、良いことです。

0
S. Mansfield