2つのパスをos.path
や共通のサブフォルダを繰り返さない他のライブラリと組み合わせる方法はありますか?すなわち2つのパスを共通のフォルダに結合する
root = '/home/user/test'
rel_path = 'test/files/file.txt'
os.combine(root, rel_path)
、代わりに/home/user/test/test/files/file.txt
2つのパスをos.path
や共通のサブフォルダを繰り返さない他のライブラリと組み合わせる方法はありますか?すなわち2つのパスを共通のフォルダに結合する
root = '/home/user/test'
rel_path = 'test/files/file.txt'
os.combine(root, rel_path)
、代わりに/home/user/test/test/files/file.txt
私はあなたが手動で行う必要があると思う、私はos.pathがこの機能を実装しているとは思わない。
def combine_with_duplicate(root, rel_path):
rs = root.split("/")
rps = rel_path.split("/")
popped = False
for v in rs:
if v == rps[0]:
rps.pop(0)
popped = True
elif popped:
break
return "/".join(rs+rps)
print(combine_with_duplicate('/home/user/test', 'test/files/file.txt'))
# /home/user/test/files/file.txt
print(combine_with_duplicate('/home/user', 'test/files/file.txt'))
# /home/user/test/files/file.txt
print(combine_with_duplicate('/home/user/test', 'user/test/files/file.txt'))
# /home/user/test/files/file.txt
あなたはos.path.join
を使用することができます/home/user/test/files/file.txt
を返す:
import os
root = '/home/user/test'
rel_path = 'test/files/file.txt'
head, tail = os.path.split(root)
final = os.path.join(head, rel_path)
print(final)
# /home/user/test/files/file.txt
'root = '/ home/user/test/files''の場合はどうすればいいですか?あなたは再帰的に行かなければならない –
残念ながら、ルートの最後の部分がrelパスの最初の部分と一致する場合にのみ動作します。再帰的に行うには、カスタムコードを記述する必要があります。再帰的には、独自の問題が発生します。 –
私は知っている、それが私が "尋ねる"理由です。そして、OPはオーバーラップのサイズを1つの共通フォルダに制限しませんでした。 –
あなたが試みることができる:
>>> import os
>>> root = '/home/user/test'
>>> rel_path = 'test/files/file.txt'
>>> os.path.join(root, '../', rel_path)
'/home/user/test/../test/files/file.txt'
またはこの、ルートおよびrel_pathの場合にしています「オーバーラップ」しない部分:
>>> os.path.join(root, '../' if root.split('/')[-1] == rel_path.split('/')[0] else '' , rel_path)
'/home/user/test/../test/files/file.txt'
>>> root = '/home/user/test/files'
>>> os.path.join(root, '../' if root.split('/')[-1] == rel_path.split('/')[0] else '' , rel_path)
'/home/user/test/files/test/files/file.txt'
'root = '/ home/user/test/files''の場合はどうなりますか?あなたは再帰的に行く必要があります –
@Ev。 Kounis、ヒントのおかげで:) –
私も 'test'フォルダ内に' test'フォルダがあるかもしれませんので、または任意のビルドがある場合.. –
はうん、思っていたがあり疑う:
たぶんのようなものを試してみてくださいlib – lapinkoira