web-dev-qa-db-ja.com

Pythonを使用してApp Engineでファイルを読み取りますか?

GAEでファイルを開いて、その内容を読み取り、最後に変更されたタグを取得することはできますか?

IOError:[Errno 13]ファイルにアクセスできません:削除または更新できないことはわかっていますが、読み取りは可能であるはずです。同様の問題に誰かが直面していますか?

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

おそらく、app.yamlでファイルを静的として宣言しました。静的ファイルはアプリケーションで使用できません。それらを静的ファイルとして提供し、アプリケーションファイルとして読み取る必要がある場合は、プロジェクトに2つのコピーを含める必要があります(理想的にはシンボリックリンクを使用するため、実際のコピーを維持する必要はありません)。

2014年11月の更新:

コメントで示唆されているように、これをapplication_readableフラグで行うことができます:

application_readable

オプション。デフォルトでは、静的ファイルハンドラーで宣言されたファイルは静的データとしてアップロードされ、エンドユーザーにのみ提供されます。アプリケーションで読み取ることはできません。このフィールドがtrueに設定されている場合、ファイルもコードデータとしてアップロードされ、アプリケーションで読み取ることができます。どちらのアップロードも、コードと静的データストレージのリソース割り当てに対して課金されます。

https://cloud.google.com/appengine/docs/python/config/appconfig#Static_Directory_Handlers を参照してください

54
Wooble

ファイルを読み取ることはできますが、Goooogleの奇抜な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()
11
MStodd

新しい「application_readable:true」機能の+1。この新しい機能を使用する前に、GAEの "wacky"ファイルシステムでNLP Montylinguaをインポートする際に問題が発生しました。

問題:Montyは、open(filename、 'rb')および静的ファイルからのバイト単位のfile_ptr.read()へのファイルポインターを使用します。私の実装はローカルのWindowsシステムで機能しましたが、展開時に失敗しました!

修正:file_ptr.read(4)#4バイナリバイトを読み取るために予期されるバイトを指定する

より多くのバイト(デフォルトでは8バイト)を読み取りたい64ビットGAEサーバーに関連するもののようです。とにかく、その問題を見つけるのにしばらく時間がかかりました。モンティリンガがロードされます。

6
jonincanada

私は奇妙だが実用的な解決策を思いついた:) Jinja :)

静的ファイルを直接提供することは、GAEで頭痛の種になることがあります。パフォーマンスとのトレードオフの可能性により、Jinjaを大幅に前進させることができます

- 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

あなたはそれを手に入れましたか;)私はテストし、それはうまくいきました。

2
guneysus

Webapp2では、pages/index.htmlと同じパスにmain.py

#!/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)
1
Ivan Chaer