用Python读App Engine上的文件?

是否可以在GAE上打开文件来读取其内容并获取最后修改的标签?

我得到一个IOError:[Errno 13]文件无法访问:我知道我不能删除或更新,但我相信阅读应该是可能的有没有人遇到类似的问题?

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

你可能在app.yaml中声明了这个文件是静态的。 静态文件不适用于您的应用程序; 如果您需要将它们作为静态文件提供并作为应用程序文件读取,则需要在项目中包含两个副本(理想情况下使用符号链接,因此实际上并不需要维护实际副本)。

2014年11月更新:

正如在评论中所build议的,你现在可以用application_readable标志来做到这一点:

 application_readable 

可选的。 默认情况下,在静态文件处理程序中声明的文件将作为静态数据上传,仅供最终用户使用,而不能由应用程序读取。 如果此字段设置为true,那么这些文件也将作为代码数据上传,以便您的应用程序可以读取它们。 这两个上传都是针对您的代码和静态数据存储资源配额。

请参阅https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers

你可以阅读文件,但他们在Goooogle古怪的GAE文件系统,所以你必须使用相对path。 我只是用一个main.py文件和test.txt在同一个文件夹中创build了一个快速应用程序。 不要忘记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() 

+1为新的“application_readable:true”function。 在使用这个新function之前,我遇到了GAE的“ 古怪 ”文件系统问题,同时让NLP Montylinguaimport。

问题:Monty使用open(filename,'rb')和一个指向file_ptr.read()的文件指针,以字节为单位从静态文件中获取。 我的实施工作在我的本地Windows系统,但部署失败!

解决方法:指定要读取file_ptr.read(4)#4个二进制字节的预期字节

看起来与64位GAE服务器有关,它想要读取更多(默认为8)字节。 反正,花了一段时间才发现这个问题。 Montylingua现在加载。

我来了奇怪的,但工作的解决scheme:) Jinja 🙂

直接提供静态文件有时会成为GAE的头痛问题。 performance可能的权衡让你直接和金嘉走到一起

 - url: /posts/(.*\.(md|mdown|markdown)) mime_type: text/plain static_files: static/posts/\1 upload: posts/(.*\.(md|mdown|markdown)) from jinja2 import Environment from jinja2.loaders import FileSystemLoader posts = Environment(loader=FileSystemLoader('static/posts/')) # Note that we use static_files folder defined in app.yaml post = posts.get_template('2013-11-13.markdown') import markdown2 # Does not need of course class Main(webapp2.RequestHandler): def get ( self ): self.response.headers[ 'Content-Type' ] = 'text/html' self.response.write ( markdown2.markdown( post.render()) ) # Jinja + Markdown Render function 

你有没有得到它;)我testing,它的工作。

使用webapp2,假设你有与main.py相同的path的pages/index.html

 #!/usr/bin/env python import webapp2, os class MainHandler(webapp2.RequestHandler): def get(self): path = os.path.join(os.path.split(__file__)[0], 'pages/index.html') with open(path, 'r') as f: page_content = f.read() self.response.write(page_content) app = webapp2.WSGIApplication([ ('/', MainHandler) ], debug=True)