2013-04-03 7 views
8

私は、複数のログファイルを解析し、処理されたファイルのリストを管理するスクリプトを作成しています。私はos.walkを使用して、次のような名前を取得し処理するファイルのリストを読み込むとき:「ルート」は、前方使用と思わPython - os.path.sepを変更できますか?

​​

C:/Users/Python/Documents/Logs\ServerUI04\SystemOut_13.01.01_20.22.25.log 

これは、次のコードによって作成されましたセパレータとしてスラッシュ(私はWindows上にあり、より便利だと思うが) "ファイル名"はバックスラッシュを使用するので、ファイルのパスが矛盾し、セパレータとして前方スラッシュとバックスラッシュが混在してしまう。

私は、セパレータを設定しようとしている:.join前

os.path.sep = "/" 

os.sep = "/" 

が、効果がないようです。私は理論的には文字列を操作することができますが、私のスクリプトをUnixとWindows上で動作させたいという長期的な言葉は、できるだけ動的であることが望ましいと思います。

何か不足していますか?

アップデート:私はそれを変更した場合

logFileFolder = ['C:/Users/Python/Documents/Logs'] 

:私の問題は、私はこのようなルートとして使用される初期パスを設定していた利便性のために、自己招いたように、その下の役に立つの応答に基づいて

が見えます

logFileFolder = ['C:\\Users\\Python\\Documents\\Logs'] 

すべてが機能し、その結果のファイルパスはすべて「\」を使用します。私のアプローチが間違っているように見えます。私が値として設定していたものを修正するのではなく、Pythonの動作を変更しようとしていたからです。

ありがとうございました!

+2

に動作します私は手足に出て行って、 'os.sep'を設定することはおそらく正しいではないことを言うだろう溶液。 –

+0

[os.path.joinはos.path.sepまたはos.sepを使用しないでください](http://stackoverflow.com/questions/12086224/why-not-os-path-join-use-os) -path-sep-or-os-sep) – BrenBarn

+0

重複した質問の回答者が指摘するように、 'os.path'はあなたのOSに応じて' posixpath'または 'ntpath'をインポートして動作します。興味深いことに、これらのモジュールのソースコードでは、パス区切り文字が 'join'関数内の文字列リテラルとしてハードコーディングされているので、独自の' join'関数を記述することなく変更することはできません。 – BrenBarn

答えて

7

私は根とファイル名を組み合わせた結果に)(os.sepオフ私の指を維持し、os.path.normpathを使用します。

filesToProcess.extend(os.path.normpath(os.path.join(root, filename)) 
      for filename in filenames if logFilePatternMatch.match(filename))  
1

あなたがos.sepos.path.sepなどに触れていないほうが良いでしょう彼らはos.path.joinが使用しているものではありません。 Anthonが提案したようにos.path.normpathを使用できます。別の方法としては、独自のシンプルなパスを持つことです参加:「/」は、WindowsとLinuxでよく働くので、私は、このprobelmを解決するために'/'.join([path1, path2])を使用

os.sep.join([i1,i2,i3])

4

を。

+1

しかし、これはすべての場合に機能しません。たとえば、 'explorer.exe'は' \ 'で指定されたパス引数だけを受け入れます。 – minerz029

0

私は以下のユーティリティ機能を優先しました。

from os.path import sep, join 

def pjoin(*args, **kwargs): 
    return join(*args, **kwargs).replace(sep, '/') 

これは、両方のバリエーション(LinuxスタイルとWindowsスタイル)をLinuxスタイルに変換します。両方のウィンドウとlinuxはPythonで '/'区切りをサポートしています。

os.sep.join(['str'、 'str'、 'str'])は、既存の区切り文字を考慮していないため拒否しました。参加バニラ対sep.joinと、次のケースを取る:

In[79]: os.sep.join(['/existing/my/', 'short', 'path']) 
Out[79]: '/existing/my/\\short\\path' 
In[80]: os.path.join('/existing/my/', 'short', 'path') 
Out[80]: '/existing/my/short\\path' 

バニラ参加が示唆して修復することができます。

In[75]: os.path.normpath(os.path.join('/existing/my/', 'short', 'path')) 
Out[75]: '\\existing\\my\\short\\path' 

これまでのところ、神なります。しかし、次に、WindowsからLinuxと対話する次のシナリオを紹介します。 os.path.normpathは、Windows上で「\」に正規化する一方、SFTPサーバは「/」区切りを見込んでいるため

local_path = os.path.normpath(os.path.join('C:\\local\\base', 'subdir', 'filename.txt')) 
remote_path = os.path.normpath(os.path.join('/remote/base', 'subdir', 'filename.txt')) 
sftp_server.upload(local_path, remote_path) 

上記は、失敗します。

pjoinユーティリティ機能または類似を使用することで、その他のクロスOS、ウェブ、FTP、

関連する問題