Unión de línea explícita en Python

Estoy leyendo un archivo, línea por línea, y estoy procesando un texto para obtener la salida en un formato determinado. Mi código de procesamiento de cadenas es el siguiente:

file1=open('/myfolder/testfile.txt')
scanlines=file1.readlines()
string = ''

 for line in scanlines:
    if line.startswith('>from'):
         continue
    if line.startswith('*'):
        continue
    string.join(line.rstrip('\n')) 

El resultado de este código es el siguiente:

abecedario

def

ghi

¿Hay alguna forma de unir estas líneas físicas en una línea lógica, por ejemplo:

abcdefghi

Básicamente, ¿cómo puedo concatenar varias cadenas en una cadena grande?

Si estaba leyendo de un archivo con cadenas muy largas, ¿existe el riesgo de un desbordamiento al concatenar varias líneas físicas en una línea lógica?

preguntado el 16 de mayo de 11 a las 19:05

4 Respuestas

Limpiando un poco las cosas, sería más fácil agregarlo a la matriz y luego devolver el resultado

def joinfile(filename) :
   sarray = []
   with open(filename) as fd :
       for line in fd :
           if line.startswith('>from') or line.startswith('*'):
               continue
          sarray.append(line.rstrip('\n'))
   return ''.join(sarray)

Si quisieras ponerte realmente lindo, también puedes hacer lo siguiente:

fd = open(filename)
str = ''.join([line.rstrip('\n') for line in fd if not (line.startswith('>from') or line.startswith('*'))])

Sí, por supuesto, podría leer un archivo lo suficientemente grande como para desbordar la memoria.

contestado el 16 de mayo de 11 a las 23:05

¡Gracias, el método de matriz solucionó más o menos mi problema! ¿Puedo preguntar, ya que quiero hacer esto en archivos con líneas muy largas, hay alguna manera de solucionar el problema de desbordamiento? Mis cadenas alcanzarán varios cientos de caracteres de longitud .. - Spyros

Las listas de Python no son matrices. Son listas. Además, no necesita los corchetes. - pillmuncher

@Spyros Es poco probable que se produzca un desbordamiento si puede leer el archivo en la memoria sin problemas ... Estos días eran archivos parlantes del orden de Gigabytes de tamaño. - koblas

@pillmuncher [De wikipedia] Un tipo de matriz es un tipo de datos destinado a describir una colección de elementos (valores o variables), cada uno seleccionado por uno o más índices que el programa puede calcular en tiempo de ejecución. Esta colección se suele denominar variable de matriz, valor de matriz o simplemente matriz. - koblas

Pero en Python todavía se llama lista. Además, la palabra matriz tiene algunas connotaciones que son simplemente incorrectas para el tipo de lista de Python, como: los elementos de la matriz son todos del mismo tipo, las matrices tienen un tamaño fijo, las matrices pueden tener múltiples dimensiones, etc. Nada de eso es cierto para las listas de Python. - pillmuncher

Hay varias formas de hacer esto. por ejemplo solo usando + debería hacer el truco.

"abc" + "def" # produce "abcdef"

Si intenta concatenar varias cadenas, puede hacerlo con el método de unión:

', '.join(('abc', 'def', 'ghi')) # produces 'abc, def, ghi'

Si no desea un delimitador, use la cadena vacía ''.join() método.

contestado el 16 de mayo de 11 a las 23:05

Gracias, la función '' .join () lo solucionó, los puse en una matriz como Koblas sugirió anteriormente. - Spyros

Usar suma de cadenas

>>> s = 'a'
>>> s += 'b'
>>> s
'ab'

contestado el 16 de mayo de 11 a las 23:05

Sin embargo, no debe usar + = para concatenar muchas cadenas. Cada + = crea una nueva cadena. Recopilarlos en una lista y llamar a join es la forma correcta. - Gurgeh

Yo preferiría:

oneLine = reduce(lambda x,y: x+y, \
                 [line[:-1] for line in open('/myfolder/testfile.txt') 
                            if not line.startswith('>from') and \
                               not line.startswith('*')])
  • line[:-1] para eliminar todos los \n
  • el segundo argumento de reduce es una lista de comprensión que extrae todas las líneas que le interesan y elimina la \n de las líneas.
  • el reduce (solo si realmente lo necesita) para hacer una cadena de la lista de cadenas.

contestado el 16 de mayo de 11 a las 23:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.