2012-08-12 4 views
19

Mam słownika:Jak pozbyć się podwójnego ukośnika odwrotnego w ścieżce pliku ścieżki Pythona?

my_dictionary = {"058498":"table", "064165":"pen", "055123":"pencil"} 

I iterację nad nim:

for item in my_dictionary: 
    PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item 
    doIt(PDF) 

def doIt(PDF): 
    part = MIMEBase('application', "octet-stream") 
    part.set_payload(open(PDF,"rb").read()) 

Ale otrzymuję ten błąd:

IOError: [Errno 2] No such file or directory: 'C:\\Users\\user\\Desktop\\File_055123.pdf' 

Nie mogę znaleźć pliku. Dlaczego sądzi się, że w ścieżce pliku występują podwójne ukośniki odwrotne?

+3

Istnieje tylko jeden ukośnik odwrotny. Widzisz reprezentację ciągów. Plik nie istnieje. –

+2

Podwójny ukośnik odwrotny nie jest błędny, python drukuje/reprezentuje go w sposób użytkownika. Jeśli 'a = r'raw s \ tring'' i' b = 'raw s \\ tring'' (no' r 'i explicite double slash), wówczas oba są reprezentowane jako '' raw s \\ tring''. – aneroid

Odpowiedz

14

Podwójny ukośnik odwrotny nie jest błędny, python drukuje/reprezentuje go w sposób użytkownika. Jeśli a = r'raw s\tring' i b = 'raw s\\tring' (bez "r" i jawnego podwójnego ukośnika), wówczas oba są reprezentowane jako 'raw s\\tring'.

>>> a = r'raw s\tring' 
>>> b = 'raw s\\tring' 
>>> a 
'raw s\\tring' 
>>> b 
'raw s\\tring' 

Btw, Twój kod jest wyraźnie edytowane i niedopasowane pomiędzy rzeczywistą i co pisał ponieważ AN oczywista różnica w komunikacie o błędzie, a nazwa pliku:

Masz:

PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item 

ale dane wyjściowe pokazują:

'C:\\Users\\user\\Desktop\\Filed_055123.pdf' 

Należy zanotować dodatkową wartość: d w nazwie pliku Filed_ w stosunku do File_. Komunikat o błędzie może pochodzić z edytowanej części.

+0

nie ma "d": "C: \\ Użytkownicy \\ użytkownik \\ Pulpit \\ Plik_055123.pdf" " –

+0

Prawdopodobnie został już opracowany. – aneroid

+8

Przepraszamy, ale nie była to pomocna odpowiedź. Więc jeśli występują podwójne ukośniki, to jak to naprawić? – DeeWBee

9

Podwójne ukośniki są spowodowane r, surowy ciąg:

r'C:\Users\user\Desktop\File_%s.pdf' , 

Służy ponieważ \ może uciec niektórych bohaterów.

>>> strs = "c:\desktop\notebook" 

>>> print strs    #here print thinks that \n in \notebook is the newline char 
c:\desktop 
otebook 

>>> strs = r"c:\desktop\notebook" #using r'' escapes the \ 
>>> print strs 

c:\desktop\notebook 

>>> print repr(strs) #actual content of strs 
'c:\\desktop\\notebook' 
+0

W powyższym przykładzie, jeśli wyświetlisz 'strs' jak' >>> strs', powinieneś otrzymać 'c: \\ desktop \\ notebook'. print nie pokazuje ucieczki, tj. podwójnego ukośnika \\ –

3

Nie spełnia. Podwójny ukośnik odwrócony jest po prostu sposobem komputera wymawiania odwrotnego ukośnika. Tak, wiem, że to brzmi dziwnie, ale pomyśl o tym w ten sposób - aby reprezentować znaki specjalne, ukośnik został wybrany jako znak przechodzący (np. \ N oznacza znak nowej linii, a nie znak ukośnika odwrotnego, za którym występuje znak n). Ale co się stanie, jeśli faktycznie chcesz wydrukować (lub użyć) ukośnika odwrotnego (prawdopodobnie po większej ilości znaków), ale nie chcesz, aby komputer traktował to jako znak uciekający? W takim przypadku unikamy samego ukośnika odwrotnego, co oznacza, że ​​używamy podwójnego ukośnika odwrotnego, aby komputer zrozumiał, że jest to pojedynczy ukośnik odwrotny.

Wykonuje się automatycznie w twoim przypadku z powodu dodanego przed ciągiem r.

-1

alwbtc @ śmiem powiedzieć: "Znalazłem błąd ..."

zastąpić

PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item 
doIt(PDF)` 

z

for item in my_dictionary: 
    PDF = r'C:\Users\user\Desktop\File_%s.pdf' % mydictionary[item] 
    doIt(PDF)` 

w rzeczywistości były naprawdę szuka File_pencil.pdf (nie File_055123.pdf). Przesuwałeś słownik indeksu, a nie jego zawartość. Ten temat na forum może być efektem ubocznym.

3

uratować się przed bólem głowy można również użyć innych ukośników. jeśli wiesz, co mówię. przeciwnie wyglądające ukośniki.

używasz teraz PDF = 'C:\Users\user\Desktop\File_%s.pdf' %item

spróbuje użyć **

PDF = 'C:/Users/user/Desktop/File_%s.pdf' %item

** nie będą traktowane jako uciekającą postać.