質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

1179閲覧

フルパスを持つPath or strから、任意に指定した階層以上だけを切り捨てたい

nomura

総合スコア116

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/08/17 04:55

編集2018/08/17 05:15

うまいタイトルが思いつかなかったのですが、以下コードでなんとなくやりたい事が見えればと思います。

def abspath_parent(target, layer): path = Path(target.name) for upper in range(layer): path = Path(target).resolve().parents[upper].name / path return path target = 'test.txt' get = abspath_parent(target, 3) # get = 'hoge/fuga/test.txt'

として値を取得しているのですが、abspath_parentのように頑張らずにスッキリ書く方法はないものでしょうか?

何らかの式(Path(target.resolve()), 3)

のような書き方でgetのような結果を取得できるものが期待する回答です。
やはり自作するしかない場合は、上記でやりたい事が実現できているので諦めます。

出来ない場合は出来ない、と教えてもらえるとそれはそれで諦めがつきます。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/08/17 05:51

target のtest.txtはhoge/fuga/test.txtに設置してあって、3階層上のパスまで取得したいということでしょうか?
guest

回答4

0

ベストアンサー

Python

1# -*- coding: utf-8 -*- 2from pathlib import Path 3target = Path('test.txt') 4# もしくはparts[-4:] 5p = Path(*target.resolve().parts[-3:]) 6print(p)

投稿2018/08/17 09:01

編集2018/08/17 09:01
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomura

2018/08/21 06:42

ご回答ありがとうございます。 partsは知らなかったです。やはりあともう少し頑張れば出来たんですね。 parentとかparents[n]はpartsのラッパーなのかな、と思いました。
guest

0

Python

1'/'.join(str(Path(target).resolve()).split('/')[-3:]))

投稿2018/08/17 06:21

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomura

2018/08/21 06:59

ご回答ありがとうございます。 そもそもPathでsplitが使えれば楽なんですよね。strに変えてからPathに戻す、という方法も良かったなぁと、回答を見て思いました。
guest

0

正規表現を使えばいいのではないでしょうか。

python

1import re 2 3def selpath(target, layer): 4 p = "(?:[^/]*/){{0,{}}}[^/]+$".format(layer-1) 5 return re.findall(p, target) 6 7x = "a/b/c/d/e" 8print(selpath(x, 1)) 9print(selpath(x, 2)) 10print(selpath(x, 6)) 11

投稿2018/08/17 06:06

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomura

2018/08/21 07:04

ご回答ありがとうございます。 今回は自身で作った関数を呼び出すことで解決したくないというのが質問の意図でした。 上手く伝える事ができず、すみません。
guest

0

やりたいこと自体は質問文の通り既に解決済みですので、期待する式が存在しなかった場合のため、自己回答しておきます。
私自身の回答は、探したけれどうまく見つけられなかったので自作するしか方法が思いつきませんでした。

さて、実現の方法は質問文中にもありますが、

def abspath_parent(target, layer): path = Path(target.name) for upper in range(layer): path = Path(target).resolve().parents[upper].name / path return path

のようなものを作って、これを呼び出せば質問の内容自体は実現できます。

forをやめてmapに変えるとか、バリデーションをしていないとかabspath_parent自体に対するツッコミは、ここでは触れません。
ただ、ループ処理やバリデートについての知見が広がるので、それはそれでコメントいただけるとありがたいです。

回答を待ってみて、難しそうならベストアンサーをつけてクローズします。

投稿2018/08/17 05:06

編集2018/08/17 05:15
nomura

総合スコア116

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問