2012-01-13 5 views
5

Ho una lista di directory rigido codificato nel mio programma, come ad esempio:Immissione di directory come le stringhe in Python

import os 
my_dirs = ["C:\a\foo" 
      ,"C:\b\foo" 
      ,"C:\c\foo" 
      ,"C:\t\foo" 
      ] 

ho poi desidera eseguire alcune operazioni come os.path.isfile(my_dirs[3]). Ma la stringa my_dirs [3] sta diventando incasinata perché "\t" è l'abbreviazione di tab o qualcosa del genere.

so che una soluzione a questo sarebbe quella di utilizzare questo:

my_dirs = ["C:\\a\\foo" 
      ,"C:\\b\\foo" 
      ,"C:\\c\\foo" 
      ,"C:\\t\\foo" 
      ] 

E un'altra soluzione potrebbe essere quella di utilizzare le barre.

Ma mi piace essere in grado di copiare le directory direttamente da Explorer al mio codice Python. C'è un modo in cui posso dire a Python di non trasformare "\t" in una scheda o qualche altra soluzione al mio problema?

risposta

8

Usa le barre o stringhe prime: r'C:\a\foo' o 'C:/a/foo'

In realtà, utilizzando le barre sono le soluzioni migliori dal momento che come @Wesley accennato, non si può avere una stringa grezza termina in una singola barra rovesciata. Mentre le funzioni da os.path utilizzano i backslash su Windows, il loro mixaggio non causa alcun problema - quindi suggerirei di usare le barre in avanti nei percorsi hardcoded e non mi interessa il backslash introdotto dalle funzioni da os.path.

Non dimenticare che i percorsi hardcoded sono di per sé una cosa negativa. Soprattutto se si utilizzano le cartelle di sistema (inclusi "Documenti" e "AppData"), è preferibile utilizzare le funzioni WinAPI per recuperarle, indipendentemente da dove si trovino effettivamente.

+0

Sono stato di programmazione in Python per un paio di mesi e non sapevo sulle stringhe prime . Molto utile, grazie. – Derek

8

Vorrei consigliare l'uso di barre inverse o doppie barre inverse. Una stringa grezza, come suggerita da ThiefMaster, può essere complicata; ad esempio, non può terminare con una barra rovesciata; così r'c: \ foo \' è non una stringa raw valida .. Visualizza python docs:

r "\" non è una stringa valida letterale (anche una stringa raw non può finire in un numero dispari di backslash). In particolare, una stringa raw non può terminare con una singola barra rovesciata (dal momento che il backslash avrebbe sfuggire la seguente citazione carattere)

+0

Buon punto. Succede che tutte le mie directory saranno in effetti file che terminano in .txt o .pdf o qualcosa del genere, quindi penso che per me sia sicuro usare stringhe raw in questo caso. Risolve il mio problema principale di voler solo copiare e incollare le directory da Windows Explorer. – Derek

+1

Le barre in avanti hanno uno svantaggio però: non appena si utilizza ['os.path.join()'] (http://docs.python.org/library/os.path.html#os.path.join) e metodi simili, introdurranno backslash. Il mix sembra brutto ma se non lo mostri mai all'utente senza normalizzare le barre non importa. Se devi visualizzarlo all'utente, considera l'utilizzo di ['os.path.normpath()'] (http://docs.python.org/library/os.path.html#os.path.normpath) prima – ThiefMaster

+0

@ThiefMaster Una stringa sostituita in seguito si occupa di questo. Non bello, ma meglio che lasciare la stringa mista esistente. – Mast

Problemi correlati