如何在App Engine上用Python读取文件?

39 投票
6 回答
20805 浏览
提问于 2025-04-15 21:33

在Google App Engine上,能不能打开一个文件只是为了读取它的内容和获取最后修改的时间呢?

我遇到了一个错误:IOError: [Errno 13] 文件无法访问。
我知道我不能删除或更新这个文件,但我觉得读取应该是可以的。
有没有人遇到过类似的问题?

os.stat(f,'r').st_mtim

6 个回答

6

我很赞同这个新功能“application_readable: true”。在使用这个新功能之前,我在导入NLP Montylingua时遇到了GAE的“奇怪”文件系统的问题。

问题是:Monty在读取静态文件时使用了open(filename,'rb')和file_ptr.read()来读取字节。我的代码在本地的Windows系统上运行得很好,但在部署后却失败了!

解决办法是:指定要读取的字节数,使用file_ptr.read(4) #读取4个二进制字节

这似乎与64位的GAE服务器有关,它默认想要读取更多的字节(8个字节)。总之,花了一些时间才找到这个问题。现在Montylingua可以正常加载了。

12

你可以读取文件,但这些文件在谷歌的奇怪的GAE文件系统上,所以你得用相对路径。我刚做了一个简单的应用程序,里面有一个main.py文件和一个test.txt文件,它们在同一个文件夹里。别忘了在st_mtime上加个'e'。

import os
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util


class MainHandler(webapp.RequestHandler):

  def get(self):
    path = os.path.join(os.path.split(__file__)[0], 'test.txt')

    self.response.out.write(os.stat(path).st_mtime)


def main():
  application = webapp.WSGIApplication([('/', MainHandler)],
                                       debug=True)
  util.run_wsgi_app(application)


if __name__ == '__main__':
  main()
54

你可能在app.yaml文件中把某个文件声明成了静态文件。静态文件是不能被你的应用程序直接使用的;如果你想同时把它当作静态文件和应用文件来用,就需要在你的项目里放两个副本(最好用符号链接,这样你就不需要维护实际的副本了)。

更新于2014年11月:

正如评论中提到的,现在你可以使用application_readable这个标志来实现:

application_readable

这个是可选的。默认情况下,在静态文件处理程序中声明的文件会被上传为静态数据,只能提供给最终用户,应用程序无法读取。如果这个字段设置为true,这些文件也会作为代码数据上传,这样你的应用程序就可以读取它们。两种上传都会计入你的代码和静态数据存储资源配额。

查看 https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers

撰写回答