[pyar] bufereo de archivos

SAn gringotumadre en gmail.com
Vie Oct 22 12:46:19 ART 2010


Qué tal?

Ayer estuve peleandome con open, codecs.open, buffering y bufsize y readline.

Al parecer open y codecs.open se comportan de forma diferente respecto
al buffering, al menos en python2.7 y python3.1 sobre linux:

Si a open le paso buffering=0 puedo ir haciendo readline y luego un
tell me devuelve la posicion correcta. Si a codecs.open le paso
buffering=0  bufferea igual y me caga el tell luego de un readline.

Ahora, en python-3.1 no me deja hacer open(..., buffering=0) pero sí
buffering=1 (line buffered). Pero codecs.open sí me deja poner
buffering=0 pero sigue haciendo cualquiera.

Como nota de color la documentación de 2.7 dice [0], primero, que
buffering en realidad se llama bufsize cosa que esta mal, y segundo
[1], que no tengo forma de saber
que onda con el buffereo (o eso entendi).

Por lo pronto lo de codecs es un bug, no encontre uno similar en el
bugtracker asi que me imagino que podria abrirlo. Como minimo debería
devolver lo mismo que hace python3 y decir que no puede usar
buffering=0, habria que mirar la implementacion de codecs.

Ideas?

Aca pongo un par de ejemplos:

En python-2.7:
#####################
# -*- coding: utf-8 -*-

import codecs

f = open("tmp.txt", "w")
word = u"asd\n"
content = word * 1000
f.write(content.encode("utf-8"))
f.close()

f = open("tmp.txt", "r", buffering=0)
line_1 = f.readline().decode("utf-8")
tell_1 = f.tell()
f.close()

f = codecs.open("tmp.txt", "rb", "utf-8", buffering=0)
line_2 = f.readline()
tell_2 = f.tell()
f.close()

assert line_1 == line_2 == word
print tell_1, tell_2

#####################
salida:
[en ~/tmp]$ python2 open_codecs.py
4 72


# En python3.1.2
#####################
# -*- coding: utf-8 -*-

import codecs

f = open("tmp.txt", "w")
word = "asd\n"
content = word * 1000
f.write(content)
f.close()

f = open("tmp.txt", "r", buffering=1) # No me deja poner buffering =
0, ValueError: can't have unbuffered text I/O
line_1 = f.readline()
tell_1 = f.tell()
f.close()

f = codecs.open("tmp.txt", "rb", "utf-8", buffering=1)
line_2 = f.readline()
tell_2 = f.tell()
f.close()

assert line_1 == line_2 == word
print (tell_1, tell_2)
#####################

[en ~/tmp]$ python open_codecs.py  # Sí es python 3, a los de arch se
les chiflo el moño
4 72

[0] http://docs.python.org/library/functions.html#open
[1] http://docs.python.org/library/functions.html#id5

SAn



More information about the pyar mailing list