كيفية نسخ ملف من مشاركة شبكة إلى القرص المحلي مع المتغيرات؟

StackOverflow https://stackoverflow.com/questions/2042342

سؤال

إذا استخدمت السطر التالي:

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)

لكنني لم يكن لدي حظا مع اختلافات مختلفة من هذا النهج.

هل كانت مفيدة؟

المحلول

ال r المستخدمة في مثال الرمز الأول الخاص بك هو جعل السلسلة سلسلة "الخام". في هذا المثال، هذا يعني أن السلسلة سترى النسخ الاحتياطانية وعدم محاولة استخدامها للهروب \\ لمجرد \.

للحصول على عمل نموذج الرمز الثاني الخاص بك، كنت تستخدم 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)

نصائح أخرى

ال r هو ل "سلسلة الخام"، وليس للأسباب. عندما لا تستخدم سلسلة الخاص بك مع r, ، ستتعامل بيثون في الخلفية "\"كحرف هروب.

لذلك عندما تحتوي السلسلة الخاصة بك على الخلفية، عليك إما أن تضع r قبل ذلك، أو وضع اثنين من الخطارات الخلفية لكل واحد واحد تريد أن تظهر.

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

هذا يبدو وكأنه مشكلة الهروب - كما يقول بالفا، r يجعل \ حرف حرفي، بدلا من تسلسل التحكم. هل جربت:

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

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

(باستخدام جلسة بيثون تفاعلية، يمكنك رؤية ما يلي:

>>> 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

من مسارات المثال الخاص بك، من الواضح أننا نناقش Windows OSوبعد تطبيق Python على نظام التشغيل هذا استخدام شائع (C) مكتبة وقت التشغيل التي تقبل التخفيضات الأمامية باعتبارها ما يعادل الخطوط الخلفية. بهذه الطريقة يمكنك تجنب قضايا سحر الهروب.

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

ملاحظة يتم التعامل مع تكوين اسم الملف Os.Path.join.:

انضم إلى واحد أو أكثر من مكونات المسار بذكاء. إذا كان أي مكون مسار مطلق، فسيتم إلقاء جميع المكونات السابقة (على Windows، بما في ذلك حرف محرك الأقراص السابق، إذا كان هناك واحد) يتم إلقاؤه، والانضمام. قيمة الإرجاع هي تسلسل المسار 1، واختيارية المسار 2، وما إلى ذلك، مع إدراج فاصل دليل واحد بالضبط (OS.SEP) بين المكونات، ما لم يكن المسار 2 فارغا. لاحظ أنه على Windows، نظرا لأنه يوجد دليل هاري لكل محرك أقراص، os.path.join ("C:"، "FOO") يمثل مسارا نسبا إلى الدليل الحالي على محرك الأقراص C: (C: FOO)، وليس ج : فو.

import os
shutil.copyfile(os.path.join(source_path, file_name),
    os.path.join(dest_path, file_name))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top