2012-02-19 9 views
27

Este es mi problema.Tira de Python con n

Estoy tratando de leer un archivo de texto y luego convertir las líneas en flotantes. El archivo de texto tiene \n y \t, aunque no sé cómo deshacerse de él.

Intenté usar line.strip() pero no se quitó y recibí un error cuando quise convertir el material en flotadores. Luego probé line.strip("\n") pero eso tampoco funcionó. Mi programa funciona bien cuando saco \t y \n del archivo de texto, pero es parte de la tarea para que funcione.

Realmente no sé por qué esto no funciona. Gracias por cualquier ayuda.

+6

¿Puede proporcionar un extracto de su archivo de texto? – Josh

+2

La tira solo elimina el espacio en blanco desde el inicio y el final de una línea. Si tiene pestañas en el medio de la línea, no las eliminará. – Swiss

+2

Merece la pena señalar que "\ n" no es el carácter de retorno en todos los sistemas. Es posible que necesite quitar "\ n", "\ r" o "\ r \ n". Si muestra algún código completo que ha intentado e ingresa datos, puede ser más fácil de resolver. –

Respuesta

1

pythons csv library es bueno para esto.

http://docs.python.org/library/csv.html

CSV = valores separados por comas, pero si se establece el delimitador = \ t, entonces funciona para valores separados por tabulaciones también.

62

Debería poder usar line.strip('\n') y line.strip('\t'). Pero estos no modifican la variable line ... simplemente devuelven la cadena con \n y \t stripped. Entonces tendrá que hacer algo como

line = line.strip('\n') 
line = line.strip('\t') 

Eso debería funcionar para eliminar desde el principio y el final. Si tiene \n y \t en medio de la cadena, que tiene que hacer

line = line.replace('\n','') 
line = line.replace('\t','') 

para reemplazar el \n y \t con la nada.

0

A menudo, dependiendo de la forma de leer las líneas, con el fin de deshacerse de \ n de myline, se puede tomar myline [: - 1] desde \ n es el último carácter de myline.

Para el '\ t' se puede utilizar replace() o tira()

1

Si usted está tratando de convertir las líneas de flotadores separados por caracteres de tabulación, a continuación, sólo float(line) tratarán de convertir toda la línea en un flotador, que fallará si hay más de uno. Usar strip para deshacerse de los espacios en blanco iniciales y finales no ayudará a ese problema fundamental.

Tal vez necesite split cada línea en pedazos y hacer algo con cada pieza?

2

¿Qué le parece usar un patrón de pitón regex?

import re 
f = open('test.txt', 'r') 
strings = re.findall(r"\S+", f.read()) 

Y para su caso de line.strip() no funcionará porque Python elimina sólo los caracteres iniciales y finales

De Python Docs - Devuelve una copia de la cadena con caracteres iniciales y finales removidos. Si se omite caracteres o Ninguno, se eliminan los caracteres de espacio en blanco.Si se da y no None, los caracteres deben ser una cadena; los caracteres de la cadena se eliminarán de los dos extremos de la cadena en la que se invoca este método.

16

El método strip() elimina los espacios en blanco de forma predeterminada, por lo que no hay necesidad de llamarlo con parámetros como '\ t' o '\ n'. Sin embargo, las cadenas en Python son inmutables y no se pueden modificar, es decir, la llamada line.strip() no cambiará el objeto line. El resultado es una nueva cadena que es devuelta por la llamada.

Como ya se mencionó, ayudaría si publicara un ejemplo de su archivo de entrada. Si hay más de un número en cada línea, strip() no es la función a usar. En su lugar, debe usar split(), que también es un método de cadena.

Para concluir, suponiendo que cada línea contiene varios flotadores separados por espacios en blanco, y que desea construir una lista de todos los números, se puede intentar lo siguiente:

floats = [] 
with open(filename) as f: 
    for line in f: 
     floats.extend([float(number) for number in line.split()]) 
0

que puede utilizar:

mylist = [] 
# Assuming that you have loaded data into a lines variable. 
for line in lines: 
    mylist.append(line.strip().split('\t') 

para obtener una lista de Python con solo los valores de campo para todas las líneas de datos.