2012-02-10 47 views
2

我正在創建一個用戶可以輸入段落文本的應用程序,並對段落運行拼寫檢查。我通過打開包含我的字典的文件'words.txt'使用python在本地文檔中實現了這一點。我試圖弄清楚如何打開一個實施我的拼寫檢查的單詞列表。創建拼寫檢查,需要訪問App Engine中的words.txt

我的第一次嘗試是將它作爲一個靜態文件放在我的目錄中,然後對文件執行一次提取操作,但我一直收到一個錯誤消息。

這裏是我的文件:

的app.yaml:

application: ******* 
version: 1 
runtime: python 
api_version: 1 

handlers: 

- url: /(.*\.txt) 
    mime_type: text/plain 
    static_files: static/\1 
    upload: static/(.*\.txt) 

- url: /.* 
    script: helloworld.py 

摘錄 helloworld.py

import os 
from google.appengine.ext.webapp import template 
import cgi 
import datetime 
import urllib 
import wsgiref.handlers 
from google.appengine.api import urlfetch 

from google.appengine.ext import db 
from google.appengine.api import users 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp.util import run_wsgi_app 

.... 

result=urlfetch.fetch(os.path.join(os.path.dirname(__file__),'words.txt')) 
words=set(result.splitlines()) 

有什麼不對?我不斷收到錯誤。

+0

可能重複[用Python讀取App Engine上的文件?](http://stackoverflow.com/questions/2630205/read-a-file-on-app-engine-with-python) – geoffspear 2012-02-10 12:43:06

回答

-1

你應該取一個完全合格的URL,像http://myapp.appspot.com/words.txt

from google.appengine.api import urlfetch, app_identity 

url = 'http://%s/words.txt' % app_identity.get_default_version_hostname() 
result=urlfetch.fetch(url) 
words=result.content 
0

你可以把谷歌App Engine的本地文件並打開它們進行讀取。
如果你的文件是在頂層,你需要的todo是這樣的:

f = open('./words.txt') 

你不需要使用網址抓取來獲取文件。

+0

Got caught up固定獲取呼叫。這也回答了這個問題,而不使用urlfetch:http:// stackoverflow。com/questions/2630205 /閱讀文件應用程序引擎與python – 2012-02-10 06:05:52

2

您無法從代碼中訪問您在app.yaml中定義爲靜態的文件。相反,要麼刪除靜態映射,要麼在代碼中包含另一個副本。然後,您可以訪問使用一些文件,如:

f = open('words.txt') 
words = f.read() 
f.close() 
+0

這似乎並不適合我。我目前有4個文件都在同一個目錄下(Project)。但是,當我使用這些行時,我得到一個頁面(我也嘗試使用'./words.txt'作爲下一個評論,但它也沒有工作):Traceback(最近呼叫最後): IOError: [Errno 2]沒有這樣的文件或目錄:'words.txt' – Danny 2012-02-13 04:40:06

+0

@Danny你有沒有檢查當前的路徑是什麼?它與您所期望的相符嗎?如果這些文件位於子目錄中,您是否正確指定路徑?你是否也確定這些文件沒有被app.yaml中的靜態處理程序捕獲? – 2012-02-13 07:38:19

2

你有一堆在這裏混了不同的文件訪問方法。當你正在做的:

result=urlfetch.fetch(os.path.join(os.path.dirname(__file__),'words.txt')) 

您正在創建「words.txt」將是你已經在同一目錄中處理程序腳本上傳,如果您還沒有宣佈它的文件的正確路徑的路徑是static_files的一部分,儘管它從你的配置出現,你想的路徑更喜歡:

os.path.join(os.path.dirname(__file__), 'static', 'words.txt') 

但是,您在這裏有兩個問題。首先,static_files是從與你的處理程序不同的進程中提供的,並且(可能)被加載到完全不同的服務器上。你不會對它們有文件系統訪問權限(我推測這就是你使用urlfetch的原因)。然而,你正在構建的路徑是用於文件系統訪問,而不是urlfetch訪問。要在生產環境中使用urlfetch,您將需要使用網絡url,正如@brianmichelich所建議的那樣 - 但請注意,使用開發服務器不能使用開發服務器,而開發服務器一次只能處理一個請求。

但是,如果您從app.yaml中刪除靜態指令,則應該可以將該路徑用作常規with/open塊的一部分。