2009-08-13 15 views
25

Soy un novato completo de Python. ¿Cómo puedo eliminar dos caracteres del comienzo de cada línea en un archivo? Yo estaba tratando de algo como esto:Cómo eliminar dos caracteres desde el comienzo de una línea

#!/Python26/ 

import re 

f = open('M:/file.txt') 
lines=f.readlines() 

i=0; 
for line in lines: 
    line = line.strip()  
    #do something here 
+3

Debe leer el tutorial (http://docs.python.org/tutorial/). Lo que estabas buscando está justo en la introducción (mira "cuerdas"). – hop

Respuesta

59

Usted fue apagado a un buen comienzo. Pruebe esto en su bucle:

for line in lines: 
    line = line[2:] 
    # do something here 

La [2:] se llama "slice" sintaxis, que esencialmente dice "dame la parte de esta secuencia que comienza en el índice 2 y continúa hasta el final (ya que no tiene fin . punto fue determinado después de los dos puntos)

+5

+1 para proporcionar la respuesta en el contexto de la pregunta * y * para la explicación del nivel para principiantes. – mhawke

20

String slicing le ayudará a:

>>> a="Some very long string" 
>>> a[2:] 
'me very long string' 
0

sólo tiene que utilizar la línea [2:]

10

en lugar de utilizar un bucle, que podría ser más feliz con aa lista por comprensión:

[line[2:] for line in lines] 

Sólo como curiosidad, hacer compruebe el cut herramienta unix.

$ cut -c2- filename 

La sintaxis de slicing para -c es bastante similar a python's.

10

Del mismo modo que una punta, se puede acortar el programa para

for line in open('M:/file.txt'): 
    line = line[2:] 

Y si usted necesita para llevar el número de línea también, utilizar

for i, line in enumerate(open('M:/file.txt.')): 
    line = line[2:] 
2
for line in open("file"): 
    print line[2:] 
3

Si desea modificar una El contenido del archivo, no solo procesa la cadena, intente el fileinputinplace parámetro:

# strip_2_chars.py 
import fileinput 
for line in fileinput.input(inplace=1): 
    print line[2:] 

A continuación, en la línea de comandos:

python strip_2_chars.py m:\file.txt 
1

Usted encontrará pitón tiene algunas grandes maneras de lidiar con cuerdas. Algunos otros métodos de cadenas útiles que puede desear ver son los de split(), replace() y startswith()/endswith().

3

Puede ser interesante saber que hay una diferencia sutil, pero importante entre:

file = open(filename) 
lines = file.readlines() 
for line in lines: 
    do something 

y

file = open(filename) 
for line in file: 
    do something 

La primera solución (con readlines) se carga todo el contenido de la archivo en la memoria y devolver una lista de python (de cadenas). Por otro lado, la segunda solución hace uso de algo que se llama iterator. De hecho, moverá el puntero al archivo según sea necesario y devolverá una cadena. Esto tiene un beneficio importante: el archivo no se carga en la memoria. Para archivos pequeños, ambos enfoques están bien.Pero siempre que solo trabaje con el archivo línea por línea, sugiero usar el comportamiento del iterador directamente.

Así que mi solución sería:

infile = open(filename) 
outfile = open("%s.new" % filename, "w") 
for line in infile: 
    outfile.write(line[2:]) 
infile.close() 
outfile.close() 

Ahora que lo pienso de ella: Si se trata de un archivo no ASCII (por ejemplo latino-1 codificado), considere el uso codecs.open. De lo contrario, puede tener una sorpresa desagradable, ya que accidentalmente puede cortar un carácter multibyte por la mitad;)

Sin embargo, si no necesita Python, y lo único que tiene que hacer es recortar los dos primeros caracteres del archivo , entonces la manera más eficiente de hacerlo es la sugerencia de kch y utilizar cut:

cat filename | cut -d2- > newfile 

para este tipo de operaciones con archivos rápida y sucia-siempre tengo instalado en mi cygwin Boxen no Linux. Pero creo que hay un conjunto de binarios de Windows para estas herramientas que funcionaría más rápido que en cygwin iirc.

0

Como está aprendiendo Python, me gustaría añadir que, dadas las herramientas que ofrece Python (cortar, dividir, reemplazar y todas las demás que se han mencionado), encontrará que para muchas tareas, la expresión regular es exagerada. Entonces, el

import re 

al principio de su ejemplo puede o no ser estrictamente necesario.

-1

No es muy eficiente pero sí funciona. Parece bastante complejo.

print line[-(len(line)-2):] 
+0

¿Por qué exactamente esto no proporciona una respuesta? – JJJ

+0

proporciona la respuesta simplemente parece complejo –

+0

Explique la lógica cuando se trata de codificación pura. ¿Qué hace tu fragmento de código y cómo resuelve el problema? Como OP es nuevo para python, le ayudará a comprender mejor el código. – Jeet

Cuestiones relacionadas