2010-07-02 16 views
142
  1. ¿Con qué frecuencia Python descarga un archivo?
  2. ¿Con qué frecuencia Python descarga al stdout?

No estoy seguro acerca de (1).¿Con qué frecuencia Python se vacia a un archivo?

En cuanto a (2), creo que Python se va al stdout después de cada nueva línea. Pero, si sobrecarga stdout a un archivo, ¿se vacía tan a menudo?

Respuesta

223

Para las operaciones de archivos, Python utiliza el almacenamiento en búfer predeterminado del sistema operativo, a menos que lo configure de otra manera. Puede especificar un tamaño de búfer, sin búfer o búfer de línea.

Por ejemplo, la función abierta toma un argumento de tamaño de búfer.

http://docs.python.org/library/functions.html#open

"El argumento de tamponamiento opcional especifica tamaño de búfer deseado del archivo: 0 significa sin búfer, 1 significa línea tamponada, cualquier otro valor positivo significa usar un tampón de ese tamaño (aproximadamente) un medio de tamponamiento negativos. utilizar el sistema por defecto, que por lo general está tamponada línea para dispositivos TTY y el búfer completo para otros archivos. Si se omite, se utiliza el valor por defecto del sistema. "

bufsize = 0 
f = open('file.txt', 'w', bufsize) 
+11

1 para la parte "búfer de línea". Eso es exactamente lo que estaba buscando y funciona como un encanto. – rein

+0

Usando Python 3.4.3 cuando hago 'abrir ('archivo.txt', 'w', 1)' obtengo el buffer de línea correcto. Pero si hago algo más grande (quería 'abrir ('archivo.txt', 'w', 512)') almacena el '' DEFAULT_BUFFER_SIZE' completo de 8192. ¿Es eso un error de Python, un error de Linux o un ID10t error? –

11

No sé si esto también se aplica a python, pero creo que depende del sistema operativo que esté ejecutando.

En Linux, por ejemplo, la salida al terminal vacía el búfer en una nueva línea, mientras que para la salida a archivos solo se vacía cuando el búfer está lleno (de manera predeterminada). Esto se debe a que es más eficiente vaciar el búfer menos veces, y es menos probable que el usuario se dé cuenta si la salida no se vacía en una nueva línea en un archivo.

Es posible que pueda vaciar automáticamente la salida si eso es lo que necesita.

EDIT: Creo que lo haría con el auto-vaciado en el pitón de esta manera (basada de here)

#0 means there is no buffer, so all output 
#will be auto-flushed 
fsock = open('out.log', 'w', 0) 
sys.stdout = fsock 
#do whatever 
fsock.close() 
107

también puede forzar vaciar el búfer en un archivo mediante programación con elMétodo

with open('out.log', 'w+') as f: 
    f.write('output is ') 
    # some work 
    s = 'OK.' 
    f.write(s) 
    f.write('\n') 
    f.flush() 
    # some other work 
    f.write('done\n') 
    f.flush() 

he encontrado esto útil cuando tizón un archivo de salida con tail -f.

+23

De los documentos: 'Nota: flush() no necesariamente escribe los datos del archivo en el disco. Use flush() seguido de os.fsync() para garantizar este comportamiento. ' – bobismijnnaam

+10

En este ejemplo, el comando es 'os.fsync (f.fileno())' – juanmah

+0

@bobismijnnaam la próxima vez que se enlace a dichos documentos. La única referencia que puedo encontrar es https://github.com/jprzywoski/python-reference/blob/master/source/docs/file/flush.rst y no sé quién es. –

7

También puede verificar el tamaño de búfer predeterminado llamando al atributo de solo lectura DEFAULT_BUFFER_SIZE del módulo io.

import io 
print (io.DEFAULT_BUFFER_SIZE) 
0

Aquí hay otro enfoque, hasta el OP para elegir cuál prefiere.

Al incluir el siguiente código en el archivo .py __init__ antes de cualquier otro tipo de código, los mensajes impresos con print y cualquier error ya no se registran en Log.txt de Ableton, pero a los archivos separados en el disco:

import sys 

path = "/Users/#username#" 

errorLog = open(path + "/stderr.txt", "w", 1) 
errorLog.write("---Starting Error Log---\n") 
sys.stderr = errorLog 
stdoutLog = open(path + "/stdout.txt", "w", 1) 
stdoutLog.write("---Starting Standard Out Log---\n") 
sys.stdout = stdoutLog 

(para Mac, cambie #username# por el nombre de su carpeta de usuario.En Windows, la ruta a su carpeta de usuario tendrá un formato diferente)

Cuando abre los archivos en un editor de texto que actualiza su contenido cuando se cambia el archivo en el disco (ejemplo para Mac: TextEdit no lo hace, pero TextWrangler sí) , verá que los registros se actualizan en tiempo real.

Créditos: este código se ha copiado en su mayoría de los guiones de superficie de control liveAPI por Nathan Ramella

Cuestiones relacionadas