Me gustaría leer un archivo de nuevo y de nuevo cuando se llega al final.

El archivo es de sólo números separados por comas.

Puedo usar python y he leído en el doc ese archivo.seek(0) se puede utilizar para esto, pero no funciona para mí.

Este es mi script:

self.users = []
self.index = -1
infile = open(filename, "r")
for line in infile.readlines():
    if line != None:
       self.users.append(String.split((line),','))
    else:
       infile.seek(0)     
       infile.read()
infile.close()
self.index= self._index +1 
return self.users[self.index]

Gracias por su ayuda

  • Lo que realmente se quiere hacer? Es el archivo de cambiar o ¿por qué leer el archivo de nuevo?
  • ¿Cuál sería el stop-condición? O quieres un bucle infinito que lee el archivo de nuevo y otra vez?
  • «El archivo es de sólo números separados por comas.» Entonces, ¿por qué no usar csv.reader?
InformationsquelleAutor tranen | 2011-03-22

4 Comentarios

  1. 2
    1. infile.read() va a leer todo el archivo y, a continuación, tirar el resultado. ¿Por qué estás haciendo esto?

    2. Cuando llame infile.readlines que ya han leído en todo el archivo. Entonces el bucle itera sobre el resultado, que es sólo una lista de Python. Movimiento para el inicio del archivo no tendrá ningún efecto sobre eso.

    3. Si el código ha hecho mover al inicio del archivo después de llegar a la final, sería simplemente bucle para siempre hasta que se corrió fuera de la memoria (debido a la infinitamente creciente users lista).

    4. Usted puede obtener el comportamiento que usted está solicitando, almacenando el resultado de readlines() en una variable y luego poner todo el for line in all_lines: bucle dentro de otro while True:. (O de cierre, reapertura y re-lectura de cada vez, si (a) usted está preocupado de que el archivo puede ser cambiado por otro programa o (b) usted quiere evitar la lectura de todo en un solo trago. Para (b) habría que reemplazar for line in infile.readlines(): con for line in infile:. Para (a), tenga en cuenta que se trata de leer un archivo, mientras que algo más se podría escribir es probable que sea una mala idea, no importa cómo usted lo hace.)

    5. Tengo la fuerte sospecha de que el comportamiento que estás pidiendo no es lo que realmente quieres. ¿Cuál es el objetivo que estamos tratando de lograr haciendo que el programa siga leyendo el archivo una y otra?

  2. 2

    El ‘else’ rama nunca va a ser perseguidos debido a que el bucle iterará sobre todas las líneas de los archivos y, a continuación, salir.
    Si desea que la operación de búsqueda a ser ejecutado deberá poner fuera del bucle for

    self.users = []
    self.index = -1
    infile = open(filename, "r")
    while True:
        for line in infile.readlines():
            self.users.append(String.split((line),','))
        infile.seek(0)             
    infile.close()
    self.index= self._index +1 
    return self.users[self.index]

    El problema es que si usted bucle para siempre que usted se escape de la memoria. Si desea leer sólo dos veces, a continuación, copie y pegue el bucle for, de lo contrario, decidir una condición de salida y el uso de una interrupción de la operación.

    • En lugar de copiar y pegar el for bucle, es probablemente mejor para cambiar el while condición con un for lazo que controla el número de veces que el bucle interno (el que lee el archivo) se ejecuta.
  3. 1

    readlines ya está leyendo todo el contenido del archivo en una lista en memoria, que eres libre para recorrer de nuevo y de nuevo!

    Para volver a leer el archivo de hacer:

    infile = file('whatever')
    while True:
        content = infile.readlines()
    
        # do something with list 'content'
    
        # re-read the file - why? I do not know
        infile.seek(0)
    
    infile.close()
  4. 0

    Puede utilizar itertools.ciclo (aquí).

    He aquí un ejemplo :

    import itertools
    f = open(filename)
    lines = f.readlines()
    f.close()
    for line in itertools.cycle(lines):
        print line,

Dejar respuesta

Please enter your comment!
Please enter your name here