Soy un novato completo de Python. ¿Cómo puedo eliminar dos caracteres del comienzo de cada línea en un archivo? Estaba intentando algo como esto:

#!/Python26/

import re

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

i=0;
for line in lines:
    line = line.strip()     
    #do something here
41
rjuuser 13 ago. 2009 a las 13:31

12 respuestas

La mejor respuesta

Tuviste un buen comienzo. Prueba esto en tu bucle:

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

El [2:] se llama "slice", esencialmente dice "dar me parte de esta secuencia que comienza en el índice 2 y continúa hasta el final (ya que no se especificó ningún punto final después de los dos puntos).

92
Amber 13 ago. 2009 a las 09:36

No es muy eficiente, pero sí funciona. Se ve bastante complejo.

print line[-(len(line)-2):]
-2
JJJ 30 jun. 2016 a las 11:38

Como está aprendiendo Python, me gustaría agregar que, dadas las herramientas que ofrece Python (segmentación, división, reemplazo 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 comienzo de su ejemplo puede o no ser estrictamente necesario.

0
Francesco 31 ago. 2009 a las 21:21

Solo usa la línea [2:]

0
Achim 13 ago. 2009 a las 09:35

Encontrarás que Python tiene excelentes maneras de lidiar con las cadenas. Algunos otros métodos de cadena útiles que puede desear verificar son los que se dividen como split (), replace (), y comienza con () / termina con ().

1
Sean 13 ago. 2009 a las 20:13
line = line[2:]
2
SilentGhost 13 ago. 2009 a las 10:32
for line in open("file"):
    print line[2:]
2
ghostdog74 13 ago. 2009 a las 09:44

Puede ser interesante saber que existe 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) cargará todo el contenido del archivo en la memoria y devolverá una lista de Python (de cadenas). Por otro lado, la segunda solución utiliza algo que se llama iterator. De hecho, esto moverá el puntero en el 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 y cuando solo trabaje con el archivo línea por línea, sugiero usar el comportamiento del iterador directamente.

Entonces 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: si es un archivo que no es ascii (por ejemplo, codificado en latin-1), considere usar codecs.open. De lo contrario, puede tener una desagradable sorpresa, ya que puede cortar accidentalmente un personaje multibyte a la mitad;)

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

cat filename | cut -d2- > newfile

Para este tipo de operaciones rápidas y sucias, siempre tengo cygwin instalado en mi box no Linux. Pero creo que también hay un conjunto de binarios de Windows para estas herramientas que funcionarían más rápido que en cygwin iirc.

3
exhuma 31 ago. 2009 a las 21:12

Si desea modificar el contenido de un archivo, no solo procesar la cadena, pruebe el parámetro fileinput inplace:

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

Luego, en la línea de comando:

python strip_2_chars.py m:\file.txt
3
orip 13 ago. 2009 a las 15:03

En lugar de usar un bucle for, podría ser más feliz con una comprensión de una lista:

[line[2:] for line in lines]

Solo como curiosidad, verifique la herramienta cut unix.

$ cut -c2- filename

La sintaxis de corte para -c es bastante similar a la de Python.

9
kch 13 ago. 2009 a las 09:41

Solo como un consejo, puede acortar su programa a

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

Y si necesita llevar el número de línea a, use

for i, line in enumerate(open('M:/file.txt.')):
    line = line[2:]
10
Otto Allmendinger 13 ago. 2009 a las 09:41

Cortar cadenas lo ayudará a:

>>> a="Some very long string"
>>> a[2:]
'me very long string'
22
Grzegorz Oledzki 13 ago. 2009 a las 09:35