Cómo leer un archivo de texto en listas separadas python

Digamos que tengo un archivo de texto con este formato:

100 20 las aves están volando

y quería leer el int (s) en sus propias listas y la cadena en su propia lista … ¿cómo podría hacer esto en python? Lo intenté

data.append(map(int, line.split())) 

Eso no funcionó … ¿Alguna ayuda?

Esencialmente, estoy leyendo el archivo línea por línea y dividiéndolos. Primero verifico si puedo convertirlos en un entero, y si fallo, los trato como cadenas.

 def separate(filename): all_integers = [] all_strings = [] with open(filename) as myfile: for line in myfile: for item in line.split(' '): try: # Try converting the item to an integer value = int(item, 10) all_integers.append(value) except ValueError: # if it fails, it's a string. all_strings.append(item) return all_integers, all_strings 

Luego, dado el archivo (‘mytext.txt’)

 100 20 the birds are flying 200 3 banana hello 4 

… haciendo lo siguiente en la línea de comandos devuelve …

 >>> myints, mystrings = separate(r'myfile.txt') >>> print myints [100, 20, 200, 3, 4] >>> print mystrings ['the', 'birds', 'are', 'flying', 'banana', 'hello'] 

Si entiendo su pregunta correctamente:

 import re def splitList(list): ints = [] words = [] for item in list: if re.match('^\d+$', item): ints.append(int(item)) else: words.append(item) return ints, words intList, wordList = splitList(line.split()) 

Te daremos dos listas: [100, 20] y ['the', 'birds', 'are', 'flying']

Aquí hay una solución simple. Tenga en cuenta que puede no ser tan eficiente como otros para archivos muy grandes, ya que itera sobre word dos veces para cada line .

 words = line.split() intList = [int(x) for x in words if x.isdigit()] strList = [x for x in words if not x.isdigit()] 

pop elimina el elemento de la lista y lo devuelve:

 words = line.split() first = int(words.pop(0)) second = int(words.pop(0)) 

Esto es, por supuesto, asumiendo que su formato es siempre int int word word word ...

Y luego unir el rest de la cadena:

 words = ' '.join(words) 

Y en Python 3 incluso puedes hacer esto:

 first, second, *words = line.split() 

Que es bastante limpio. Aunque todavía tendría que convertir first y second a int .