Python中有FileIO吗?

时间:2009-08-27 20:48:47

标签: python file-io stream

我知道Python中有一个StringIO流,但在Python中是否存在文件流这样的东西?还有更好的方法让我查看这些东西吗?文档等......

我正在尝试将“流”传递给我制作的“作家”对象。我希望我可以将文件句柄/流传递给这个编写器对象。

3 个答案:

答案 0 :(得分:8)

我猜你在寻找open()。 http://docs.python.org/library/functions.html#open

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

关于您可以使用流做的所有事情的文档(这些在Python中称为“文件对象”或“类文件对象”):http://docs.python.org/library/stdtypes.html#file-objects

答案 1 :(得分:5)

有一个内置文件(),其工作方式大致相同。以下是文档:http://docs.python.org/library/functions.html#filehttp://python.org/doc/2.5.2/lib/bltin-file-objects.html

如果要打印文件的所有行,请执行以下操作:

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

当然还有更多,比如.seek(),. close(),. read(),. readlines(),......基本上和StringIO的协议一样。

编辑:您应该使用open()而不是file(),它具有相同的API - file()在Python 3中。

答案 2 :(得分:1)

在Python中,所有I / O操作都包含在高级API中:文件喜欢对象。

这意味着任何喜欢object的文件都会表现相同,并且可以在期望它们的函数中使用。这称为duck typing,对于类似文件的对象,您可能会遇到以下行为:

  • 打开/关闭/ IO例外
  • 迭代
  • 缓冲
  • 阅读/写作/寻求

StringIO,File和所有类似文件的文件都可以真正替换为彼此,而且您不必关心自己管理I / O.

作为一个小小的演示,让我们看看你可以用标准输出stdout做什么,它是一个类似对象的文件:

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"

所有类似对象的文件都表现相同,您应该以相同的方式使用它们:

# 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

请注意,像objects这样的文件共享一个共同的行为,但是创建像object这样的文件的方式并不标准:

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

Un last world,不是因为它的工作方式与底层行为相同。了解您正在使用的内容非常重要。在最后一个示例中,在Internet资源上使用“for”循环非常危险。实际上,你知道你最终不会得到无限的数据流。

在这种情况下,使用:

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

更安全。高抽象是强大的,但不能让你知道这些东西是如何运作的。