2012-04-13 12 views
72

特定のパスの親ディレクトリの名前を抽出する必要があります。これは次のようになります。c:\ stuff \ directory_i_need \ subdir \ file "ファイル"の内容をdirectory_i_needの名前(パスではない)を使用して変更しています。私は、その後、私のすべてのファイルのリストを与える機能...私はそれを行うことができますどのようにPythonでファイルパス(ディレクトリ)の一部を抽出します

for path in file_list: 
    #directory_name = os.path.dirname(path) # this is not what I need, that's why it is commented 
    directories, files = path.split('\\') 

    line_replace_add_directory = line_replace + directories 
    # this is what I want to add in the text, with the directory name at the end 
    # of the line. 

を作成していますか?

+1

あなたはこの答えをチェックアウトする場合があります:http://stackoverflow.com/a/4580931/311220 – Acorn

+0

上記のリンクは、私は理解してどのように役立ったかに私が間違ったことを修正してください。ありがとうございました。 – Thalia

答えて

103
import os 
## first file in current dir (with full path) 
file = os.path.join(os.getcwd(), os.listdir(os.getcwd())[0]) 
file 
os.path.dirname(file) ## directory of file 
os.path.dirname(os.path.dirname(file)) ## directory of directory of file 
... 

そして、あなたは、必要に応じて、このように何回もやって続けることができます...

編集:

os.pathから、あなたはos.path.splitやos.path.basenameのいずれかを使用することができます
dir = os.path.dirname(os.path.dirname(file)) ## dir of dir of file 
## once you're at the directory level you want, with the desired directory as the final path node: 
dirname1 = os.path.basename(dir) 
dirname2 = os.path.split(dir)[1] ## if you look at the documentation, this is exactly what os.path.basename does. 
+0

パスの一部を抽出しますが、実際のディレクトリ名をパスから抽出する方法はわかりません。 – Thalia

+1

投稿を編集してディレクトリ名抽出を組み込みました。 –

-1

パス全体をos.path.splitのパラメータとして指定する必要があります。 The docsを参照してください。文字列分割のようには機能しません。

+0

これは、Windows上のUNC型のパス名では機能しません。これは、os.path stuffステートのPythonドキュメントです。 – ely

4

まず、splitunc()が利用可能な機能としてos.pathにあるかどうかを確認します。返される最初の項目は、あなたが望むものでなければなりませんが、私はLinux上にあり、osをインポートして使用しようとすると、この機能はありません。

そうでなければ、仕事を取得し1半醜い方法が使用することです。ただ、ファイル上のディレクトリを取得示した

>>> pathname = "\\C:\\mystuff\\project\\file.py" 
>>> pathname 
'\\C:\\mystuff\\project\\file.py' 
>>> print pathname 
\C:\mystuff\project\file.py 
>>> "\\".join(pathname.split('\\')[:-2]) 
'\\C:\\mystuff' 
>>> "\\".join(pathname.split('\\')[:-1]) 
'\\C:\\mystuff\\project' 

、ちょうどその上のディレクトリ。

+0

rsplitの使用方法を示すために私のエントリーを編集しましたが、それはあなたの提案をしていますが、ディレクトリ名だけでなくパスも与えてくれます。 – Thalia

+1

私はまだあなたが何を求めているのか明確ではありません。なぜあなたは\\次に次のインスタンスのすべてを取り除かないのですか?あなたがパスを望むようなふりをして、それを\\に分割するときに最後のエントリを保持してください。これはうまくいくはずですか? – ely

+0

私はパスを分割し、私が欲しかった作品を取ってしまいました。それは前にはうまくいませんでしたが、これらの答えをすべて読んだ後、私は間違ったことを発見しました。 – Thalia

1

これは私がディレクトリの一部を抽出するためにやったことです:

for path in file_list: 
    directories = path.rsplit('\\') 
    directories.reverse() 
    line_replace_add_directory = line_replace+directories[2] 

ありがとうございます。あなたが使用できるのPython 3.4で

12

pathlib module

>>> from pathlib import Path 
>>> p = Path('C:\Program Files\Internet Explorer\iexplore.exe') 
>>> p.name 
'iexplore.exe' 
>>> p.suffix 
'.exe' 
>>> p.root 
'\\' 
>>> p.parts 
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe') 
>>> p.relative_to('C:\Program Files') 
WindowsPath('Internet Explorer/iexplore.exe') 
>>> p.exists() 
True 
+0

APIの素晴らしいデモ –

+0

これはPythonの古いバージョンにもバックポートされています:[pathlib2](https://pypi.python.org/pypi/pathlib2/) – phoenix