web-dev-qa-db-fra.com

Comment se débarrasser de la double barre oblique inverse dans python chaîne de chemin de fichier Windows?

J'ai un dictionnaire:

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

J'y répète:

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

Mais je reçois cette erreur:

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

Il ne trouve pas mon dossier. Pourquoi pense-t-il qu'il y a des doubles barres obliques inverses dans le chemin du fichier?

22
alwbtc

La double barre oblique inversée n'est pas fausse, python représente comme cela pour l'utilisateur. Dans chaque double barre oblique inversée \\, le premier échappe le second pour impliquer une barre oblique inverse réelle. Si a = r'raw s\tring' et b = 'raw s\\tring' (pas de 'r' et de double barre oblique explicite) alors ils sont tous les deux représentés comme 'raw s\\tring'.

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

Pour plus de précision, lorsque vous imprimez la chaîne, vous la voyez telle qu'elle serait utilisée, comme dans un chemin - avec une seule barre oblique inverse:

>>> print(a)
raw s\tring
>>> print(b)
raw s\tring

Et dans ce boîtier de chaîne imprimé, le \t n'implique pas un onglet , c'est une barre oblique inversée \ suivi de la lettre 't'.

Sinon, une chaîne sans préfixe "r" et une seule barre oblique inversée échapperaient au caractère après , ce qui lui ferait évaluer le "t" qui le suit == languette:

>>> t = 'not raw s\tring'  # here '\t' = tab
>>> t
'not raw s\tring'
>>> print(t)  # will print a tab (and no letter 't' in 's\tring')
not raw s       ring

Donc dans le PDF chemin + nom:

>>> item = 'xyz'
>>> PDF = r'C:\Users\user\Desktop\File_%s.pdf' % item
>>> PDF         # the representation of the string, also in error messages
'C:\\Users\\user\\Desktop\\File_xyz.pdf'
>>> print(PDF)  # "as used"
C:\Users\user\Desktop\File_xyz.pdf

Plus d'informations sur séquences d'échappement dans le tableau ici . Regarde aussi __str__ contre __repr__ .

14
aneroid

Les doubles barres obliques inverses sont dues à r, chaîne brute:

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

Il est utilisé car le \ pourrait échapper à certains des caractères.

>>> 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'
10
Ashwini Chaudhary

vous éviter d'avoir mal à la tête, vous pouvez également utiliser d'autres barres obliques. si vous savez ce que je dis. les barres obliques opposées.

vous utilisez maintenant PDF = 'C:\Users\user\Desktop\File_%s.pdf' %item

essayez d'utiliser **

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

** il ne sera pas traité comme un personnage en fuite.

3
Abdul

Ce n'est pas le cas. La double barre oblique inversée n'est que la façon dont l'ordinateur dit la barre oblique inverse. Oui, je sais que cela semble bizarre, mais pensez-y de cette façon - afin de représenter les caractères spéciaux, la barre oblique inversée a été choisie comme caractère d'échappement (par exemple,\n signifie la nouvelle ligne, et non pas la barre oblique inverse suivie du caractère n). Mais que se passe-t-il si vous souhaitez réellement imprimer (ou utiliser) une barre oblique inverse (éventuellement suivie de plusieurs caractères), mais que vous ne voulez pas que l'ordinateur la traite comme un caractère d'échappement? Dans ce cas, nous échappons à la barre oblique inverse elle-même, ce qui signifie que nous utilisons une double barre oblique inverse pour que l'ordinateur comprenne qu'il s'agit d'une seule barre oblique inverse.

C'est fait automatiquement dans votre cas à cause du r que vous avez ajouté avant la chaîne.

3
Eran Zimmerman