変数を使用してネットワーク共有からローカルディスクにファイルをコピーする方法

network-programming python share
変数を使用してネットワーク共有からローカルディスクにファイルをコピーする方法

次の行を使用する場合:

shutil.copyfile(r"\\mynetworkshare\myfile.txt","C:\TEMP\myfile.txt")

すべてうまくいきます。 ただし、「r」(相対?)フラグが必要なため、ネットワーク共有パスで変数を使用する方法がわからないようです。 私が想像する最終結果は次のようなものになるでしょう:

source_path = "\\mynetworkshare"
dest_path = "C:\TEMP"
file_name = "\\myfile.txt"

shutil.copyfile(r source_path + file_name,dest_path + file_name)

しかし、私はこのアプローチのさまざまなバリエーションに成功していません。

  11  5


ベストアンサー

最初のコード例で使用される `r`は、文字列を「生の」文字列にしています。 この例では、文字列にバックスラッシュが表示され、それらを使用して「\\」を「\」だけにエスケープしようとはしません。

2番目のコードサンプルを機能させるには、 copyfile`コマンドではなく、文字列で r`を使用します。

source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
file_name = "\\myfile.txt"

shutil.copyfile(source_path + file_name, dest_path + file_name)

22


「r」は「生の文字列」用であり、相対的なものではありません。 文字列の前に r`を付けない場合、Pythonはバックスラッシュ" `\ “をエスケープ文字として扱います。

そのため、文字列にバックスラッシュが含まれる場合、その前に `r`を置くか、表示したいそれぞれに2つのバックスラッシュを置く必要があります。

>>> r"\\myfile" == "\\\\myfile"
True

4


これは逃げる問題のように見えます-balphaが言うように、 r`は \ `文字を制御シーケンスではなくリテラルにします。 やってみました:

source_path = r"\\mynetworkshare"
dest_path = r"C:\TEMP"
filename = r"\my_file.txt"

shutil.copyfile(source_path + filename, dest_path + filename)

(インタラクティブなpythonセッションを使用すると、次のことがわかります。

>>> source_path = r"\\mynetworkshare"
>>> dest_path = r"C:\TEMP"
>>> filename = r"\my_file.txt"
>>> print (source_path + filename)
\\mynetworkshare\my_file.txt
>>> print (dest_path + filename)
C:\TEMP\my_file.txt

3


サンプルパスから、「Windows OS」について議論していることは明らかです。 このOSでのPython実装は、バックスラッシュと同等のスラッシュを受け入れる共通( C)ランタイムライブラリを使用します。 これにより、エスケープ文字の問題を回避できます。

source_path = "//mynetworkshare"
dest_path = "C:/TEMP"
file_name = "/myfile.txt"

ファイル名の構成はhttp://docs.python.org/library/os.path.html#os.path.join[os.path.join]によって処理されることに注意してください。

_
1つ以上のパスコンポーネントをインテリジェントに結合します。 いずれかのコンポーネントが絶対パスの場合、以前のすべてのコンポーネント(以前のドライブ文字がある場合はそれを含むWindows上の)はすべて破棄され、結合が続行されます。 戻り値は、path2が空でない限り、path1とオプションでpath2などを連結したもので、コンポーネント間に挿入されるディレクトリセパレーター(os.sep)は1つだけです。 Windowsでは、各ドライブに現在のディレクトリが存在するため、os.path.join( “c:”、 “foo”)はcではなくドライブC:(c:foo)の現在のディレクトリからの相対パスを表すことに注意してください。 :\ foo。
_

import os
shutil.copyfile(os.path.join(source_path, file_name),
    os.path.join(dest_path, file_name))

1


タイトルとURLをコピーしました