16

次の行を使用する場合:

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)

しかし、私はこのアプローチのさまざまなバリエーションでうまくいきませんでした。

4

4 に答える 4

28

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

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

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

shutil.copyfile(source_path + file_name, dest_path + file_name)
于 2010-01-11T14:22:14.740 に答える
5

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

したがって、文字列にバックスラッシュが含まれている場合は、その前に を付けるか、r表示するバックスラッシュごとに 2 つのバックスラッシュを付ける必要があります。

>>> r"\\myfile" == "\\\\myfile"
True
于 2010-01-11T14:20:06.773 に答える
3

これはエスケープの問題のように見えます-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
于 2010-01-11T14:21:46.457 に答える
1

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

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

ファイル名の構成はos.path.joinによって処理されることに注意してください。

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

import os
shutil.copyfile(os.path.join(source_path, file_name),
    os.path.join(dest_path, file_name))
于 2010-01-11T14:31:09.760 に答える