質問: os.path.join('C:users', 'ネットワーク', 'servername') if os.path.exists(filepath): print ("指定のファイルもしくはディレクトリが存在しています。") else: print ("指定のファイルもしくはディレクトリが存在していません。") filepath ``` というコードを書きました。 共有サーバーへアクセスできれば、 「"指定のファイルもしくはディレクトリが存在しています。」 と表示されるはずです。 しかし、filepath は、'C:users\\ネットワーク\\servername' と生成しますが、 指定のファイルもしくはディレクトリが存在していません。 そもそも、「ネットワーク」というディレクトリを見つけることができませんでした。 どのように指定すれば、共有サーバにアクセスすることができるでしょうか。 よろしくお願いします。
回答: バージョン3.4以降なら標準の`pathlib`をお勧めします。 ``` import pathlib share = pathlib.WindowsPath(r'\\servername\') if share.exists(): print("指定のファイルもしくはディレクトリが存在しています。") print(list(share.glob('*'))) # servername以下のフォルダ、ファイルを列挙 else: print("指定のファイルもしくはディレクトリが存在していません。") ``` 追記&パスに誤りがあったので修正しました > > pathlib.WindowsPath('servername') には、引っ掛からないです。 > > > Microsoftネットワークに対応したパス指定を`UNCパス`といいます(Microsoftの固有名詞です)。pathlibをお勧めしたのはUNCパスをちゃんと扱えるからです。 外部サーバなどを指定するUNCパスの記法として、'\\servername\'のように先頭に'\\'が必要です(Windowsでは¥マークになるでしょう)。そうでなければ、現在のワーキングディレクトリ以下でservernameを探してしまいます。 ところでPythonを含む多くの言語では`\`から始まる文字はエスケープ文字といわれ、例えば`\n`は改行文字になるのはご存知だと思います。`\\`(バックスラッシュ二つ)は一つの`\`の文字と解釈されますから、'\\servername'という文字列を作るには'\\\\servername'のようにバックスラッシュ(あるいは¥)が4つ必要です。Pythonではr'\'のような記法でエスケープ文字を抑止できますから、これの使い時でしょう。 私の環境では以下のコードでローカルPCのUsers以下のものが列挙されます。 ``` print(list(pathlib.WindowsPath(r'\\localhost\Users').glob('*'))) ``` Windowsネットワークは使っていないので、外部サーバの指定は試していません。PythonがUNCパスを解釈して正しくアクセスできてると確認できれば、問題の半分は解決したと考えてよいでしょう。 リンクについては、単にリンクを使わなければよいと思います。