2012-05-08 12 views
14

Sono nuovo in Python e nella codifica in generale. Sto provando a leggere da un file di testo che ha i nomi dei percorsi su ogni riga. Vorrei leggere il file di testo riga per riga e dividere le stringhe di riga in unità, percorso e nome del file.Divisione di stringhe di percorso in parti di unità, percorso e nome file

Ecco il mio codice finora:

ottengo il seguente errore:

File "C:/Users/visc/scratch/simple.py", line 14, in <module> 
    (drive,path,file) = os.path.split(line) 
ValueError: need more than 2 values to unpack 

non ricevo questo errore quando voglio solo il percorso e il nome del file.

risposta

23

è necessario utilizzare os.path.splitdrive prima:

with open('C:/Users/visc/scratch/scratch_child/test.txt') as f: 
    for line in f: 
     drive, path = os.path.splitdrive(line) 
     path, filename = os.path.split(path) 
     print('Drive is %s Path is %s and file is %s' % (drive, path, filename)) 

Note:

  • la dichiarazione with si assicura che il file viene chiuso alla fine del blocco (file anche ottenere chiuso quando il netturbino li mangia, ma l'utilizzo di with è generalmente una buona pratica
  • non è necessario il bracketing ETS - os.path.splitdrive (percorso) restituisce una tupla, e questo otterrà automaticamente spacchettato
  • file è il nome di una classe nello spazio dei nomi di serie e non si deve probabilmente sovrascrivere :)
+0

Ciao Nk, ho ricevuto il seguente output: Drive is Path è "S: \ Entourage \ GIS \ HemloBelt \ Claims e il file è Entourage_Claims_Master.shp", quindi non proprio quello che mi aspettavo. Ogni riga è formattata in questo modo: "S: \ Entourage \ GIS \ HemloBelt \ Claims \ Entourage_Claims_Master.shp", – Visceral

+0

Suppongo che tu sia su una macchina Windows. Prima di 'drive, path = ...', aggiungi 'line = line.replace (" \\ ","/")' per sostituire i backslash con le barre in avanti e vedere se questo fa il trucco. –

+0

Ho scoperto perché si stava comportando come ha fatto. Avevo citazione che circonda ogni stringa di linea nel mio file di testo originale. – Visceral

3

È possibile utilizzare os.path.splitdrive() per ottenere l'unità e quindi path.split() il resto.

## Open the file with read only permit 
f = open('C:/Users/visc/scratch/scratch_child/test.txt') 

for line in f: 
    (drive, path) = os.path.splitdrive(line) 
    (path, file) = os.path.split(path) 

    print line.strip() 
    print('Drive is %s Path is %s and file is %s' % (drive, path, file)) 
+0

Grazie per Prendendo il tempo di rispondere. – Visceral

+0

Hi Jordanm, questo è ciò che è stato stampato sul mio schermo: 'codice'" S: \ Entourage \ GIS \ HemloBelt \ Claims \ Entourage_Claims_Master.shp ", L'unità è Path è" S: \ Entourage \ GIS \ HemloBelt \ Claims and file è Entourage_Claims_Master.shp ", non proprio quello che avevo in mente. – Visceral

Problemi correlati