python - 如何使 Python 的 ast 模块在烧瓶中工作?
问题描述
我有一个 python 脚本正在使用ast.literal_eval
并且工作正常。
import csv
import datetime
import time
import ast
def checkDateTime():
fileName = "Bhuvneshwar Kumar-2018-05-10.csv"
mydict = {}
myList = []
start = datetime.datetime.strptime("2018-05-10 14:41:38", '%Y-%m-%d %H:%M:%S')
period = 5
with open(fileName, 'rb') as csv_reader:
reader = csv.reader(csv_reader)
print "Reading"
for row in reader:
currDict = ast.literal_eval(row[0])
now = datetime.datetime.strptime(currDict["timeStamp"], '%Y-%m-%d %H:%M:%S')
if((now >= start) and (now - start <= datetime.timedelta(minutes = 100))):
myList.append(currDict)
print currDict["timeStamp"]
checkDateTime()
但是,在 Flask 中使用相同的方法会引发错误:
from __future__ import print_function
import sys
from flask import Flask, render_template, redirect, url_for, request
import os
import csv
import datetime
import time
from testDict import entityDict, date
import json
import ast
app = Flask(__name__)
app.secret_key = os.urandom(24)
@app.route("/")
def helloFromBubble():
return "Hi there!"
@app.route("/tweetsAllReq")
def stream():
fileName = "#DDvSRH-2018-05-10-Watson.csv"
csv_reader = csv.reader(FileTailer(open(fileName)))
def generate():
for row in csv_reader:
yield '{}\n'.format(json.dumps(row))
return app.response_class(generate(), mimetype='text/plain')
@app.route("/tweetsTimeFrame", methods = ["GET"])
def streamEntity():
tweetList = []
entity = request.args.get("entity")
startTime = request.args.get("start")
period = request.args.get("period")
if(period == None or startTime == None or entity == None):
return "Status: Failure. Reason: Failed to load because of some missing params."
fileName = str(entity) + "-" + str(date) + ".csv"
start = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M:%S')
with open(fileName, 'rb') as csv_reader:
reader = csv.reader(csv_reader)
for row in csv_reader:
print(row)
#currDict = ast.literal_eval(row[0])
#now = datetime.datetime.strptime(currDict["timeStamp"], '%Y-%m-%d %H:%M:%S')
#if((now >= start) and (now - start <= datetime.timedelta(seconds = period))):
#tweetList.append(currDict)
return "hi"
if(__name__ == "__main__"):
app.run(debug = True, port = 5000)
在文件中打印时,它很好地显示了第一行(来自我的 csv)。EOL 发生在\n
,我知道如何在不修改我的 CSV 文件的情况下转义它。我的问题是使烧瓶脚本与我的另一个脚本(上述)一样好。
这是错误:
文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第 1997 行,调用中返回 self.wsgi_app(environ, start_response) 文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第 1985 行,在 wsgi_app 响应 = self.handle_exception(e) 文件“/usr /local/lib/python2.7/dist-packages/flask/app.py”,第 1540 行,在 handle_exception reraise(exc_type, exc_value, tb) 文件“/usr/local/lib/python2.7/dist-packages/ flask/app.py”,第 1982 行,在 wsgi_app response = self.full_dispatch_request() 文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第 1614 行,在 full_dispatch_request rv = self.handle_user_exception(e) 文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第 1517 行,在 handle_user_exception reraise(exc_type, exc_value, tb) 文件“/usr/local/ lib/python2.7/dist-packages/flask/app.py”,第 1612 行,在 full_dispatch_request rv = self.dispatch_request() 文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第 1598 行,在 dispatch_request 中返回 self.view_functionsrule.endpoint 文件“/home/aviral /dev/bubble/apiV2.py”,第 45 行,在 streamEntity currDict = ast.literal_eval(row[0]) 文件“/usr/lib/python2.7/ast.py”,第 49 行,在literal_eval node_or_string = parse (node_or_string, mode='eval') File "/usr/lib/python2.7/ast.py", line 37, in parse return compile(source, filename, mode, PyCF_ONLY_AST) File "", line 1 " ^ SyntaxError : 扫描字符串文字时 EOL/home/aviral/dev/bubble/apiV2.py”,第 45 行,在 streamEntity currDict = ast.literal_eval(row[0]) 文件“/usr/lib/python2.7/ast.py”,第 49 行,在literal_eval node_or_string = parse(node_or_string, mode='eval') File "/usr/lib/python2.7/ast.py", line 37, in parse return compile(source, filename, mode, PyCF_ONLY_AST) File "", line 1 " ^ SyntaxError: EOL 同时扫描字符串文字/home/aviral/dev/bubble/apiV2.py”,第 45 行,在 streamEntity currDict = ast.literal_eval(row[0]) 文件“/usr/lib/python2.7/ast.py”,第 49 行,在literal_eval node_or_string = parse(node_or_string, mode='eval') File "/usr/lib/python2.7/ast.py", line 37, in parse return compile(source, filename, mode, PyCF_ONLY_AST) File "", line 1 " ^ SyntaxError: EOL 同时扫描字符串文字扫描字符串文字时 EOL扫描字符串文字时 EOL
csv 文件的内容(几行):
"{u'emotion': {u'anger': 0.173654, u'joy': 0.167818, u'sadness': 0.275962, u'fear': 0.127876, u'disgust': 0.125381}, u'count': 1 , u'sentiment': {u'score': 0.515437, u'label': u'positive'}, u'text': u'Bhuvneshwar Kumar', u'disambiguation': {u'subtype': [], u'name':u'Bhuvneshwar Kumar',u'dbpedia_resource':u' http://dbpedia.org/resource/Bhuvneshwar_Kumar '},'tweetId':'994588277943365633','timeStamp':'2018-05-10 14:41:38', u'relevance': 0.710619, u'type': u'Person', 'tweet': 'FOUR\n\nJason Roy 开着它越过 Bhuvneshwar Kumar 直奔边界。\n\n# IPL2018 #DDvSRH'}"
"{u'emotion': {u'anger': 0.173654, u'joy': 0.167818, u'sadness': 0.275962, u'fear': 0.127876, u'disgust': 0.125381}, u'count': 1 , u'sentiment': {u'score': 0.515437, u'label': u'positive'}, u'text': u'Bhuvneshwar Kumar', u'disambiguation': {u'subtype': [], u'name':u'Bhuvneshwar Kumar',u'dbpedia_resource':u' http://dbpedia.org/resource/Bhuvneshwar_Kumar '},'tweetId':'994588917839036422','timeStamp':'2018-05-10 14:44:11', u'relevance': 0.710619, u'type': u'Person', 'tweet': 'FOUR\n\nJason Roy 开着它越过 Bhuvneshwar Kumar 直奔边界。\n\n# IPL2018 #DDvSRH'}"
解决方案
for row in csv_reader:
应该改为
for row in reader:
错误是读取行中的反斜杠 n。如果将它们作为一行读取,则问题将得到解决。为了确保读取的内容是行而不仅仅是一个字符串,它是在读取器中迭代而不是文件对象的导入:csv_reader。
完整的工作代码将是:
from __future__ import print_function
import sys
from flask import Flask, render_template, redirect, url_for, request
import os
import csv
import datetime
import time
from testDict import entityDict, date
import json
import ast
app = Flask(__name__)
app.secret_key = os.urandom(24)
@app.route("/")
def helloFromBubble():
return "Hi there!"
@app.route("/tweetsAllReq")
def stream():
fileName = "#DDvSRH-2018-05-10-Watson.csv"
csv_reader = csv.reader(FileTailer(open(fileName)))
def generate():
for row in csv_reader:
yield '{}\n'.format(json.dumps(row))
return app.response_class(generate(), mimetype='text/plain')
@app.route("/tweetsTimeFrame", methods = ["GET"])
def streamEntity():
tweetList = []
currDict = None
entity = request.args.get("entity")
startTime = request.args.get("startTime")
period = int(request.args.get("period"))
empty = []
if(period == None):
empty.append("period")
if(startTime == None):
empty.append("start")
if(entity == None):
empty.append(entity)
if(len(empty) > 0):
return "Status: Failure. Reason: Failed to load " + str(empty)
fileName = str(entity) + "-" + str(date) + ".csv"
start = datetime.datetime.strptime(startTime, '%Y-%m-%d %H:%M:%S')
with open(fileName, 'rb') as csv_reader:
reader = csv.reader(csv_reader)
for row in reader:
currDict = ast.literal_eval(row[0])
now = datetime.datetime.strptime(currDict["timeStamp"], '%Y-%m-%d %H:%M:%S')
if((now >= start) and (now - start <= datetime.timedelta(minutes = period))):
tweetList.append(currDict)
return json.dumps(tweetList)
if(__name__ == "__main__"):
app.run(debug = True, port = 5000)
推荐阅读
- python - 在熊猫数据框中拆分一列不删除 na
- javascript - 在 iOS 上调用“fetch”时出现 Javascript“TypeError:cancelled”错误
- ruby-on-rails - Adding font awesome icon dynamically causes page to scroll to top
- c - 为什么 printf("%s\n", "123456789" + 3); //输出:“456789”
- c++ - QT,我做了无模式对话框,现在我想通过单击一个按钮来关闭所有对话框
- html - Windows 10 - HTTP 错误 500.19 - 内部服务器错误
- python - python中的“上面定义的重新声明的变量没有使用”?
- image-processing - 带有填充的平均池的期望行为是什么?
- javascript - 如何使用角度突出显示用于搜索的字母
- mdx - MDX 查询 - 由于 where 导致 YTD 产生不正确的结果