Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python程序突然开始抛出KeyError_Python - Fatal编程技术网

python程序突然开始抛出KeyError

python程序突然开始抛出KeyError,python,Python,我向服务器发出API请求,然后解析json响应并将其保存到csv文件中。一切正常,但现在突然,程序抛出错误 奇怪的是,当我在我的笔记本电脑上运行相同的代码时,它可以工作,但在vps上,它抛出了异常(它刚才也在vps上工作,vps上没有任何可能导致异常的更改) 我的python代码: from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.triggers.cron import CronTrig

我向服务器发出API请求,然后解析json响应并将其保存到csv文件中。一切正常,但现在突然,程序抛出错误

奇怪的是,当我在我的笔记本电脑上运行相同的代码时,它可以工作,但在vps上,它抛出了异常(它刚才也在vps上工作,vps上没有任何可能导致异常的更改)

我的python代码:

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import requests
import json
import csv
from datetime import datetime


print("Started...")
def fn():
    print("        Writing Data...")
    session_id = "auZsJ4F2RsQNJxSPTMDt2238324"
    Outlook='http://www.myfxbook.com/api/get-community-outlook.json?session=' + session_id
    Outlook_response = requests.get(Outlook)
    Outlook_data = Outlook_response.json()['symbols']
    now = datetime.now()
    current_time = now.strftime("%H:%M")


    EURUSD=Outlook_data[0]
    SHORTPERC0=EURUSD['shortPercentage']
    LONGPERC0 =EURUSD['longPercentage']
    SHORTvolume0=EURUSD['shortVolume']
    longVolume0=EURUSD['longVolume']
    longPositions0=EURUSD['longPositions']
    shortPositions0=EURUSD['shortPositions']

    with open('myfile.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([current_time, SHORTvolume0, longVolume0, longPositions0, shortPositions0])

        print("        done...")

sched = BlockingScheduler()

# Execute fn() at the start of each minute.
sched.add_job(fn, trigger=CronTrigger(second=1))
sched.start()
{
"error": false,
"message": "",
"symbols": [{
    "name": "EURUSD",
    "shortPercentage": 45,
    "longPercentage": 55,
    "shortVolume": 23273.25,
    "longVolume": 28123.5,
    "longPositions": 74045,
    "shortPositions": 60996,
    "totalPositions": 135041,
    "avgShortPrice": 1.1709,
    "avgLongPrice": 1.1975
}
这些是错误:

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import requests
import json
import csv
from datetime import datetime


print("Started...")
def fn():
    print("        Writing Data...")
    session_id = "auZsJ4F2RsQNJxSPTMDt2238324"
    Outlook='http://www.myfxbook.com/api/get-community-outlook.json?session=' + session_id
    Outlook_response = requests.get(Outlook)
    Outlook_data = Outlook_response.json()['symbols']
    now = datetime.now()
    current_time = now.strftime("%H:%M")


    EURUSD=Outlook_data[0]
    SHORTPERC0=EURUSD['shortPercentage']
    LONGPERC0 =EURUSD['longPercentage']
    SHORTvolume0=EURUSD['shortVolume']
    longVolume0=EURUSD['longVolume']
    longPositions0=EURUSD['longPositions']
    shortPositions0=EURUSD['shortPositions']

    with open('myfile.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([current_time, SHORTvolume0, longVolume0, longPositions0, shortPositions0])

        print("        done...")

sched = BlockingScheduler()

# Execute fn() at the start of each minute.
sched.add_job(fn, trigger=CronTrigger(second=1))
sched.start()
{
"error": false,
"message": "",
"symbols": [{
    "name": "EURUSD",
    "shortPercentage": 45,
    "longPercentage": 55,
    "shortVolume": 23273.25,
    "longVolume": 28123.5,
    "longPositions": 74045,
    "shortPositions": 60996,
    "totalPositions": 135041,
    "avgShortPrice": 1.1709,
    "avgLongPrice": 1.1975
}

该错误是否与APScheduler有关?还是一个关键错误

json响应如下所示:

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import requests
import json
import csv
from datetime import datetime


print("Started...")
def fn():
    print("        Writing Data...")
    session_id = "auZsJ4F2RsQNJxSPTMDt2238324"
    Outlook='http://www.myfxbook.com/api/get-community-outlook.json?session=' + session_id
    Outlook_response = requests.get(Outlook)
    Outlook_data = Outlook_response.json()['symbols']
    now = datetime.now()
    current_time = now.strftime("%H:%M")


    EURUSD=Outlook_data[0]
    SHORTPERC0=EURUSD['shortPercentage']
    LONGPERC0 =EURUSD['longPercentage']
    SHORTvolume0=EURUSD['shortVolume']
    longVolume0=EURUSD['longVolume']
    longPositions0=EURUSD['longPositions']
    shortPositions0=EURUSD['shortPositions']

    with open('myfile.csv', 'a', newline='') as file:
        writer = csv.writer(file)
        writer.writerow([current_time, SHORTvolume0, longVolume0, longPositions0, shortPositions0])

        print("        done...")

sched = BlockingScheduler()

# Execute fn() at the start of each minute.
sched.add_job(fn, trigger=CronTrigger(second=1))
sched.start()
{
"error": false,
"message": "",
"symbols": [{
    "name": "EURUSD",
    "shortPercentage": 45,
    "longPercentage": 55,
    "shortVolume": 23273.25,
    "longVolume": 28123.5,
    "longPositions": 74045,
    "shortPositions": 60996,
    "totalPositions": 135041,
    "avgShortPrice": 1.1709,
    "avgLongPrice": 1.1975
}

这与服务器有关,它甚至无法获取JSON响应本身,而不是缺少
符号
键。这种错误可能在大多数情况下都会发生,您可以忽略它,或者按如下方式处理它

try:
    Outlook_data = Outlook_response.json()['symbols']
except:
    print("An error has occurred while getting the data. Please try again later.")

这与服务器有关,它甚至无法获取JSON响应本身,而不是缺少
符号
键。这种错误可能在大多数情况下都会发生,您可以忽略它,或者按如下方式处理它

try:
    Outlook_data = Outlook_response.json()['symbols']
except:
    print("An error has occurred while getting the data. Please try again later.")

这可能适用于您:

    Request = 'https://www.myfxbook.com/api/login.json?email=username&password=password'
    response = requests.get(Request, verify = False)
    data = response.json()
    Session = data['session']
    path = ('https://www.myfxbook.com/api/get-community-outlook.json?session=' + Session)
    Outlook_response = requests.get(path, verify = False)
    Outlook_data = Outlook_response.json()['symbols']
要避免因发出多个请求而被阻止,请使用不同的用户代理标头

例如:

headers = {
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
Outlook_response = requests.get(Outlook, headers=headers)
Outlook_data = Outlook_response.json()['symbols']

这可能适用于您:

    Request = 'https://www.myfxbook.com/api/login.json?email=username&password=password'
    response = requests.get(Request, verify = False)
    data = response.json()
    Session = data['session']
    path = ('https://www.myfxbook.com/api/get-community-outlook.json?session=' + Session)
    Outlook_response = requests.get(path, verify = False)
    Outlook_data = Outlook_response.json()['symbols']
要避免因发出多个请求而被阻止,请使用不同的用户代理标头

例如:

headers = {
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
Outlook_response = requests.get(Outlook, headers=headers)
Outlook_data = Outlook_response.json()['symbols']


dict`Outlook_response.json()`没有键符号。感谢@balderman的响应,但我可以从响应中清楚地看到,响应中有一个键“symbols”,请在查找键之前打印dict。你确定它在那里吗?字典绝对没有“符号”键。我不能告诉你我浪费了多少时间调试一个假设,我知道数据是什么,依赖于我认为的数据是什么。正如@balderman所说,
Outlook\u response\u parsed=Outlook\u response.json();打印(Outlook\u响应\u解析);Outlook\u data=Outlook\u response\u解析['symbols']
以绝对确定是哪些数据触发了错误。是否可能一台计算机上接收到的响应与另一台计算机上接收到的响应不同?dict`Outlook\u response.json()`没有钥匙符号。感谢@balderman的回复,但我可以从回复中清楚地看到,在回复中有一个钥匙“符号”。在寻找钥匙之前,请打印dict。你确定它在那里吗?字典绝对没有“符号”键。我不能告诉你我浪费了多少时间调试一个假设,我知道数据是什么,依赖于我认为的数据是什么。正如@balderman所说,
Outlook\u response\u parsed=Outlook\u response.json();打印(Outlook\u响应\u解析);Outlook\u data=Outlook\u response\u解析['symbols']
绝对确定是哪些数据触发了错误。一台计算机上接收到的响应是否可能与另一台计算机上接收到的响应不同?网站本身为付费用户提供了api访问权限,让他们每分钟调用两次api,以便用户可以使用数据I制定自己的解决方案更新我的答案我希望这项工作将尝试更新的答案,并在此处更新它的运行方式网站本身为付费用户提供了api访问,以每分钟进行两次api调用,以便用户可以使用数据制定自己的解决方案我更新了我的答案我希望这项工作将尝试更新的答案,并在此处更新它的运行方式我不这样做知道为什么有人否决了这个答案,因为它说的是对的。在抓取过程中,没有得到响应是很常见的,并且可能有各种原因(例如超时、网站检测机器人和阻止你…)。开发人员有责任认识到这一点并处理这些情况。完全同意这个答案和其他答案,如果没有收到响应,您将得到一个
TimeoutError
,或者某种
ConnectionError
。如果服务器返回一个空响应或是一些无效的JSON,您将得到类似于
JSONDecodeError
的结果。如果响应是字符串
null
,则会出现
TypeError
。只有在连接成功、收到响应并且是字典的有效JSON(并且该字典缺少
符号
键)的情况下,才能在该行中引发OP错误消息中的
KeyError
,这意味着这个答案的第一句显然是错误的。此外:忽略一个操作中的错误,这似乎是进一步计算所必需的,很难解决问题,除非OP明确指出这是一个偶然操作,其中错误是可忽略的;除了
,一个能捕捉任何和所有错误的裸露的
,是一个错误,几乎不应该被使用。@Amadan,我同意你的评论。我没有正确地表达我的意见,答案确实有一些缺点——但我不喜欢有人写下答案,至少显示了一个可能的方向(即使用try/except),但没有说明原因,也没有提供更好的解决方案。谢谢你提供了宝贵的细节。我不知道为什么有人否决了这个答案,因为它说的是对的。在抓取过程中,没有得到响应是很常见的,并且可能有各种原因(例如超时、网站检测机器人和阻止你…)。开发人员有责任认识到这一点并处理这些情况。完全同意这个答案和其他答案,如果没有收到响应,您将得到一个
TimeoutError
,或者某种
ConnectionError
。如果服务器返回一个空响应或是一些无效的JSON,您将得到类似于
JSONDecodeError
的结果。如果响应是字符串
null
,则会出现
TypeError
。A<