Sé que hay una secuencia de StringIO en Python, pero ¿existe una secuencia de archivo en Python? ¿También hay una mejor manera de buscar estas cosas? Documentación, etc.

Estoy tratando de pasar un "flujo" a un objeto "escritor" que hice. Esperaba poder pasar un identificador / secuencia de archivos a este objeto de escritor.

1
biznez 28 ago. 2009 a las 00:48

3 respuestas

La mejor respuesta

Supongo que estás buscando open (). http://docs.python.org/library/functions.html#open

outfile = open("/path/to/file", "w")
[...]
outfile.write([...])

Documentación sobre todas las cosas que puede hacer con los flujos (estos se denominan "objetos de archivo" u "objetos similares a archivos" en Python): http://docs.python.org/library/stdtypes.html#file-objects

8
Phil 27 ago. 2009 a las 21:04

En Python, todas las operaciones de E / S están envueltas en una API de alto nivel: al archivo le gustan los objetos.

Significa que cualquier objeto que le guste a un archivo se comportará igual, y puede usarse en una función que lo espera. Esto se llama escritura de pato, y para archivos como objetos puede esperar el siguiente comportamiento:

  • abrir / cerrar / IO Excepciones
  • iteración
  • amortiguamiento
  • lectura / escritura / búsqueda

StringIO, File y todos los objetos similares a archivos pueden reemplazarse realmente entre sí, y no tiene que preocuparse por administrar las E / S usted mismo.

Como pequeña demostración, veamos qué puede hacer con stdout, la salida estándar, que es un archivo como objeto:

import sys
# replace the standar ouput by a real opened file
sys.stdout = open("out.txt", "w")
# printing won't print anything, it will write in the file
print "test"

Todos los objetos similares a los archivos se comportan igual, y debe usarlos de la misma manera:

# try to open it
# do not bother with checking wheter stream is available or not

try :
    stream = open("file.txt", "w")
except IOError :
    # if it doesn't work, too bad !
    # this error is the same for stringIO, file, etc
    # use it and your code get hightly flexible !
    pass
else :
    stream.write("yeah !")
    stream.close()

# in python 3, you'd do the same using context :

with open("file2.txt", "w") as stream :
    stream.write("yeah !")

# the rest is taken care automatically

Tenga en cuenta que los métodos de archivo como objetos comparten un comportamiento común, pero la forma de crear un archivo como objeto no es estándar:

import urllib
# urllib doesn't use "open" and doesn't raises only IOError exceptions
stream = urllib.urlopen("www.google.com")

# but this is a file like object and you can rely on that :
for line in steam :
    print line

En el último mundo, no es porque funcione de la misma manera que el comportamiento subyacente es el mismo. Es importante entender con qué está trabajando. En el último ejemplo, usar el ciclo "for" en un recurso de Internet es muy peligroso. De hecho, sabes que no terminarás con un flujo infinito de datos.

En ese caso, usando:

print steam.read(10000) # another file like object method

Es más seguro. Las altas abstracciones son poderosas, pero no te ahorran la necesidad de saber cómo funcionan las cosas.

1
e-satis 28 ago. 2009 a las 13:33

Hay un archivo incorporado () que funciona de la misma manera. Estos son los documentos: http://docs.python.org/library/functions.html #file y http://python.org /doc/2.5.2/lib/bltin-file-objects.html.

Si desea imprimir todas las líneas del archivo, haga lo siguiente:

for line in file('yourfile.txt'):
  print line

Por supuesto, hay más, como .seek (), .close (), .read (), .readlines (), ... básicamente el mismo protocolo que para StringIO.

Editar: debe usar open () en lugar de file (), que tiene la misma API: file () va en Python 3.

5
bayer 27 ago. 2009 a las 20:55