El módulo sys
ofrece tres descriptores de fichero abiertos, habitual de los sistemas POSIX:
sys.stdin
: entrada estándarsys.stdout
: salida estándarsys.stderr
: salida de error estándar.Para leer (de la entrada) o escribir (en las salidas) se utilizan respectivamente los métodos read()
y write()
:
In [1]:
import sys
sys.stdin.read()
Out[1]:
La función builtin raw_input()
lee de sys.stdin
.
In [33]:
user_input = raw_input()
In [34]:
sys.stdout.write("Escribiendo en stdout")
sys.stdout.write(" más")
La función print()
escribe también sobre stdout
:
In [35]:
print("escribiendo con print")
print("más")
In [5]:
sys.stderr.write("Escribiendo en stderr")
In [6]:
fd = file('tmp/foo', 'w')
fd.write("hello hello\n")
fd.write("una segunda línea\n")
fd.write("y la última")
fd
Out[6]:
In [7]:
fd.close()
fd
Out[7]:
In [8]:
fd = file('tmp/foo')
fd.closed
Out[8]:
El descriptor POSIX es accesible es accesible con el método fileno()
.
In [9]:
fd.fileno()
Out[9]:
In [10]:
fd.mode
Out[10]:
In [11]:
fd.name
Out[11]:
In [12]:
fd.readline()
Out[12]:
Obtener la posición del puntero:
In [13]:
fd.tell()
Out[13]:
In [14]:
fd.readlines()
Out[14]:
Mover el puntero al comienzo.
In [15]:
fd.seek(0)
El fichero es iterable:
In [16]:
for line in fd:
print(line),
El método read()
acepta la cantidad de bytes a leer. Si no se indica lee todo lo posible.
In [17]:
fd.seek(0)
fd.read()
Out[17]:
In [18]:
fd.seek(0)
fd.read(17)
Out[18]:
In [19]:
import os
fd = os.open('tmp/foo', os.O_RDONLY)
fd
Out[19]:
In [20]:
os.read(fd, 20)
Out[20]:
In [21]:
os.close(fd)
Es posible obtener el descriptor entero de un file
con el método fileno()
. También es posible crear un objeto file
a partir de un descriptor entero con os.fdopen()
:
In [22]:
fd = os.open('tmp/foo', os.O_RDONLY)
os.fdopen(fd)
Out[22]:
In [23]:
fd = file('tmp/bar', 'w')
fd.write("some text")
In [24]:
!cat tmp/bar
In [25]:
fd.flush()
In [26]:
!cat tmp/bar
In [27]:
fd.close()
También es posible definir el tamaño de ese buffer (que puede ser 0):
In [28]:
fd = file('tmp/bar', 'w', 0)
fd.write("some text")
In [29]:
!cat tmp/bar
In [30]:
fd.close()
In [31]:
# sys.stdout = os.fdopen(1, 'w', 0)
# sys.stdout.write("hi!")
StringIO
permite crear objetos que tienen la misma interfaz que file
pero que almacenan el contenido en memoria.
In [32]:
import StringIO
fd = StringIO.StringIO()
fd.write('foo bar')
fd.write('fuzz')
print(fd.getvalue())
fd.close()