Importación de datos .txt en un formato particular

esta es una siguiente muestra de datos

"TABITHA","OLLIE","JAIME","WINIFRED"

seguido de un fragmento de código que lo lee correctamente.

with open("names.txt", 'rb') as f:
    data = [map(str, line.split(',')) for line in f]

Sin embargo, esto lo lee como una lista de listas. La lista es solo una lista 'alta',

e.g. [["TABITHA", "OLLIE", "JAIME", "WINIFRED"]]

y por lo tanto bien podría ser solo una lista, no una lista de listas. ¿Hay alguna manera de leerlo como una lista? El viaje de aprendizaje continúa :-)

preguntado el 04 de julio de 12 a las 03:07

4 Respuestas

Utiliza las "pilas incluidas" csv (valores separados por comas) módulo. A pesar del nombre, también se puede configurar para otros separadores y también tiene otras opciones.

import csv
with open('names.txt','rb') as f:
    for line in csv.reader(f):
        print line

Salida:

['TABITHA', 'OLLIE', 'JAIME', 'WINIFRED']

Respondido 04 Jul 12, 03:07

Ok, entonces conseguiste que csv funcionara, lo cual es mejor que yo: p. Pero, ¿cómo hago para que esto se convierta en una lista que luego pueda usar en mi módulo? En este momento solo lo estás imprimiendo - nebfa

line es la lista. Solo úsalo. si quiere todas las líneas en el archivo, use list(csv.reader(f)) en vez de for bucle, pero obtendrá una lista de listas nuevamente incluso si solo tiene una línea. Con el for bucle, procesa una línea a la vez y solo tiene una línea. - marca tolonen

Wow, lo probé antes pero no me di cuenta de que tenía esta funcionalidad. Entonces, hacer solo eso 'con' y 'para' en realidad importa la línea como una lista completa. No me di cuenta de eso porque no había un código obvio que lo sugiriera. Mi última pregunta entonces es: digamos que no quiero imprimir 'línea', solo quiero leerlo, qué tipo de relleno debo usar con Python. ¡Gracias! - nebfa

Si sabes que es solo la única línea que podrías escribir line = csv.reader(f).next() en vez de for. - marca tolonen

Impresionante que funciona, en el futuro digamos que tengo varias líneas, ¿qué tipo de relleno usaría? Estoy empezando a aprender por completo, así que tengo 1,000,000 de preguntas: p - nebfa

La mejor manera de leer algo como esto es usar el módulo csv. Esto tratará correctamente las comas incrustadas que pueden aparecer en los valores citados.

Respondido 04 Jul 12, 03:07

Editar

Funcional, "roll-your-own", código:

with open("names.txt", 'rb') as f:
    for line in f:
       line = line.strip()
       line = [w.replace('"','') for w in line.split(',')]
       print line

crea el -- line:

['TABITHA', 'OLLIE', 'JAIME', 'WINIFRED']

Respondido 04 Jul 12, 03:07

@downvoter .. este código es funcional y cumple con las especificaciones de OP. - Levon

con open("names.txt", 'rb') como f: for line in f: line = [w.replace('"','') for w in line.split(',')] también funciona - No hay necesidad de desvestirse. Gracias. nebfa

No el votante negativo, pero si los datos tienen comas entre comillas, esto no funciona, por lo que es mejor usar un módulo probado como csv en lugar de roll-your-own. - marca tolonen

@MarkTolonen Estoy de acuerdo en usar el módulo csv (como lo hizo) es un mejor enfoque, pero dada la muestra de datos (no vi ninguna coma entre las comillas) y el resultado deseado, esto funciona: genera el mismo resultado que su solución. - Levon

@BenLucato .. sin el strip() Me sale esto como el último elemento: 'WINIFRED\r\n'] entonces creo que el strip() es necesario. Estoy de acuerdo en que usar el módulo CSV es un mejor enfoque en general. - Levon

Si quieres ser tonto y no usar un módulo CSV:

sum([line.split(", ") for line in f], [])

Editar: ¿Qué pasa con mis datos iniciales entonces?

>>> f
['TABITHA, OLLIE, JAIME, WINIFRED', 'Spam, Eggs, Dead Parrots']
>>> sum([line.split(", ") for line in f], [])
['TABITHA', 'OLLIE', 'JAIME', 'WINIFRED', 'Spam', 'Eggs', 'Dead Parrots']

Con un archivo:

$ cat temp.csv
foo, bar, baz
spam, eggs, quux
$ python
>>> f = open("temp.csv")
>>> sum([line.split(", ") for line in f], [])
['foo', 'bar', 'baz\n', 'spam', 'eggs', 'quux\n']

(Agregue en un map(str.strip, ...) para deshacerse de los espacios en blanco finales)

Respondido 04 Jul 12, 03:07

los rendimientos ['"TABITHA","OLLIE","JAIME","WINIFRED"\n'] cuando lo ejecuto. - Levon

Sí, esto lee un total de ~45000 elementos de mis datos, mientras que solo debería haber ~5000 elementos - nebfa

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.