2017-05-17 17 views
0

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

私も 'test'フォルダ内に' test'フォルダがあるかもしれませんので、または任意のビルドがある場合.. –

+0

はうん、思っていたがあり疑う:

たぶんのようなものを試してみてくださいlib – lapinkoira

答えて

2

私はあなたが手動で行う必要があると思う、私は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 
0

あなたは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 
+0

'root = '/ home/user/test/files''の場合はどうすればいいですか?あなたは再帰的に行かなければならない –

+0

残念ながら、ルートの最後の部分がrelパスの最初の部分と一致する場合にのみ動作します。再帰的に行うには、カスタムコードを記述する必要があります。再帰的には、独自の問題が発生します。 –

+0

私は知っている、それが私が "尋ねる"理由です。そして、OPはオーバーラップのサイズを1つの共通フォルダに制限しませんでした。 –

0

あなたが試みることができる:

>>> 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' 
+0

'root = '/ home/user/test/files''の場合はどうなりますか?あなたは再帰的に行く必要があります –

+0

@Ev。 Kounis、ヒントのおかげで:) –

関連する問題