2012-05-08 9 views
14

Soy nuevo en python y la codificación en general. Intento leer un archivo de texto que tiene nombres de ruta en cada línea. Me gustaría leer el archivo de texto línea por línea y dividir las cadenas de línea en unidad, ruta y nombre de archivo.División de cadenas de ruta en unidades, rutas y partes de nombre de archivo

Aquí está mi código hasta ahora:

me sale el siguiente error:

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 

no recibo este error cuando sólo quiero que la ruta y el nombre del archivo.

Respuesta

23

Es necesario utilizar os.path.splitdrive primera:

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

Notas:

  • la declaración with asegura que el archivo se cierra al final del bloque (archivos también se cierran cuando el recolector de basura los come, pero usar with es generalmente una buena práctica
  • no necesita el brack ets - os.path.splitdrive (path) devuelve una tupla, y esto hará que automáticamente desempaquetado
  • file es el nombre de una clase en el espacio de nombres estándar y es probable que no debe sobrescribir :)
Gracias por
+0

Hola Nk, recibí el siguiente resultado: Drive is Path es "S: \ Entourage \ GIS \ HemloBelt \ Claims y el archivo es Entourage_Claims_Master.shp", por lo que no es exactamente lo que esperaba. Cada línea tiene el siguiente formato: "S: \ Entourage \ GIS \ HemloBelt \ Claims \ Entourage_Claims_Master.shp", – Visceral

+0

Supongo que está en una máquina con Windows. Antes de 'drive, path = ...', agrega 'line = line.replace (" \\ ","/")' para reemplazar las barras diagonales inversas con barras diagonales y ver si eso funciona. –

+0

Descubrí por qué se comportaba como lo hizo. Tuve citas que rodean cada cadena de líneas en mi archivo de texto original. – Visceral

3

Puede usar os.path.splitdrive() para obtener el disco y luego path.split() el 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

Tomando el tiempo para responder. – Visceral

+0

Hola Jordan, esto es lo que se imprimió en mi pantalla: 'código'" S: \ Entourage \ GIS \ HemloBelt \ Claims \ Entourage_Claims_Master.shp ", Drive is Path es" S: \ Entourage \ GIS \ HemloBelt \ Claims and el archivo es Entourage_Claims_Master.shp ", no es exactamente lo que tenía en mente. – Visceral

Cuestiones relacionadas