首页 > 解决方案 > 如何使 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'}"

标签: python

解决方案


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)

推荐阅读