2010-01-11 7 views
10

Jeśli używam następujący wiersz:Jak skopiować plik z udziału sieciowego na dysk lokalny za pomocą zmiennych?

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

wszystko działa poprawnie. Jednak nie wydaje mi się, aby dowiedzieć się, jak używać zmiennej ze ścieżką udziału sieciowego, ponieważ potrzebuję flagi "r" (względny?). Końcowy wynik, jaki sobie wyobrażam, byłby następujący:

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

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

Ale nie miałem szczęścia w różnych odmianach tego podejścia.

Odpowiedz

15

r używane w pierwszym przykładzie kodu sprawia, że ​​ciąg jest „surowy” smyczkowy ten przykład, oznacza to, że ciąg będzie zobaczyć backslashy i nie starają się wykorzystywać je do ucieczki \\ tylko \.

aby otrzymać drugą pracę przykładowy kod, by użyć r na sznurki, a nie w komendzie w copyfile:

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

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

Również polecam patrząc na 'os.path' bibliotece. Wtedy możesz zastąpić 'file_name =" \\ myfile.txt "' z 'file_name =" myfile.txt "' i 'shutil.copyfile (source_path + file_name, dest_path + file_name)' z 'shutil.copyfile (os.path.join (source_path, file_name), os.path.join (dest_path, file_name))', które praca na różnych platformach –

+0

Dzięki, to było to, czego szukałem –

+0

Pomyśleć, że przez cały ten czas myślałem, że oznaczało to regex - dzięki! – Ross

4

Numer r dotyczy "nieprzetworzonego łańcucha", a nie względnego. Kiedy nie dodasz prefiksu do nazwy r, Python potraktuje ukośnik odwrotny "\" jako znak escape.

Tak więc, gdy twój ciąg zawiera ukośniki odwrotne, musisz najpierw wstawić przed nim znak r lub umieścić dwa ukośniki odwrotne dla każdego, z którego chcesz się pojawić.

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

To wygląda jak ucieczki emisji - jak mówi balpha The r sprawia \ charakter dosłownym, a nie sekwencję sterującą. Czy próbowałeś:

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

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

(Korzystanie interaktywną sesję Pythona, można znaleźć w następujących miejscach:.

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

Z Twojego przykład ścieżek, to jasne, że omawiamy Windows OS. Implementacja Pythona w tym systemie operacyjnym korzysta ze wspólnej biblioteki wykonawczej (C), która akceptuje ukośniki w przód jako odpowiednik ukośników. W ten sposób unikniesz problemów z funkcjami escape.

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

Należy zauważyć, że skład nazwa pliku jest obsługiwany przez os.path.join:

Dołącz jeden lub więcej składników ścieżki inteligentnie. Jeśli dowolny składnik jest ścieżką bezwzględną, wszystkie poprzednie składniki (w systemie Windows, w tym poprzednia litera dysku, jeśli była), są odrzucane, a dołączanie jest kontynuowane. Wartością zwracaną jest konkatenacja ścieżki 1 i opcjonalnie ścieżka2 itd. Z dokładnie jednym separatorem katalogu (os.sep) wstawionym między komponentami, chyba że ścieżka2 jest pusta. Zauważ, że w systemie Windows, ponieważ istnieje katalog bieżący dla każdego dysku, os.path.join ("c:", "foo") reprezentuje ścieżkę względem bieżącego katalogu na dysku C: (c: foo), a nie c :\bla.

import os 
shutil.copyfile(os.path.join(source_path, file_name), 
    os.path.join(dest_path, file_name)) 
Powiązane problemy