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
.