Tengo un problema que no he visto a nadie en StackOverflow encontrar o incluso google para ese asunto.Python no lee todo el archivo de texto
Mi objetivo principal es poder reemplazar las ocurrencias de una cadena en el archivo con otra cadena. ¿Hay alguna manera de poder acceder a todas las líneas del archivo?
El problema es que cuando intento leer en un archivo de texto grande (1-2 gb) de texto, python solo lee un subconjunto de él.
Por ejemplo, voy a hacer un muy simple comando como:
newfile = open("newfile.txt","w")
f = open("filename.txt","r")
for line in f:
replaced = line.replace("string1", "string2")
newfile.write(replaced)
Y sólo escribe los primeros 382 MB del archivo original. ¿Alguien ha encontrado este problema anteriormente?
I intentado algunas soluciones diferentes, tales como el uso de:
import fileinput
for i, line in enumerate(fileinput.input("filename.txt", inplace=1)
sys.stdout.write(line.replace("string1", "string2")
pero tiene el mismo efecto. Tampoco leer el archivo en trozos como el uso de
me he reducido a su mayoría probablemente siendo una lectura en la solución y no un problema de escritura, ya que ocurre por el simple hecho de imprimir líneas. Sé que hay más líneas. Cuando lo abro en un editor de texto completo como Vim, puedo ver cuál debería ser la última línea, y no es la última línea que imprime Python.
¿Alguien puede ofrecer algún consejo o algo para probar?
Actualmente estoy usando una versión de 32 bits de Windows XP con 3,25 GB de RAM, y funcionando de Python 2.7
* Editar solución encontrada (Gracias Lattyware). El uso de un iterador
def read_in_chunks(file, chunk_size=1000):
while True:
data = file.read(chunk_size)
if not data: break
yield data
Leer línea por línea con un iterador debería ser una operación perezosa, por lo que debería funcionar independientemente del tamaño del archivo. Si bien no debería afectar su situación, también querrá usar '' with'' al abrir archivos; es una buena práctica que maneja el cierre bajo excepciones correctamente. –
¡Funcionó muy bien! Muchas gracias. * editar: intenté publicar aquí el código del iterador, pero no formateó, así que lo agregué a la publicación original. – user1297872
¿Has probado con un archivo de texto grande diferente? ¿Hay algo extraño con el archivo 382mb in - algún carácter extraño que está siendo tratado como el final del archivo? – neil