Python (discord.py): 循环中特定单词后的新行(输入)
Python (discord.py): New line(enter) after specific words in a loop
我目前正在开发航空天气 Discord 机器人,用户可以在其中请求机场的具体天气。因此,例如,当您输入:!metar KJFK
它应该 return METAR(气象机场报告)和 TAF(终端机场预报)。
此刻,我让它工作了,但它 return 是单行的。这是我进入阿姆斯特丹-史基浦国际民航组织站时得到的结果:
输入:!METAR EHAM
输出:
METAR: EHAM 071755Z 27008KT 230V300 9999 FEW030 19/11 Q1016 NOSIG
TAF: TAF EHAM 071707Z 0718/0824 26010KT 9999 FEW030 BECMG 0719/0722 19003KT BECMG 0812/0815 27008KT PROB30 TEMPO 0812/0816 7000 -SHRA FEW025TCU BECMG 0821/0824 23003KT
应该如何:
EHAM 071755Z 27008KT 230V300 9999 FEW030 19/11 Q1016 NOSIG
TAF EHAM 071707Z 0718/0824 26010KT 9999 FEW030
BECMG 0719/0722 19003KT
BECMG 0812/0815 27008KT
PROB30
TEMPO 0812/0816 7000 -SHRA FEW025TCU
BECMG 0821/0824 23003KT
所以在每个 'BECMG' 和 'TEMPO' 之后它从一个新行开始。我已经尝试了几个小时来解决这个问题。我还在学习所以我希望有人能够帮助我解决这个问题。
我目前的代码:
@client.command(aliases=['METAR', 'TAF', 'taf'])
async def metar(ctx, *, metar_station):
#METAR
url_metar = 'https://www.aviationweather.gov/adds/dataserver_current/current/metars.cache.csv'
response = urllib.request.urlopen(url_metar)
lines = [l.decode('utf-8') for l in response.readlines()]
cr = csv.reader(lines)
for row in cr:
if row[0].startswith(metar_station):
result_metar = row[0]
#TAF
url_taf = 'https://www.aviationweather.gov/adds/dataserver_current/current/tafs.cache.csv'
response_taf = urllib.request.urlopen(url_taf)
lines_taf = [l.decode('utf-8') for l in response_taf.readlines()]
cr_taf = csv.reader(lines_taf)
for row_taf in cr_taf:
if row_taf[0].startswith(str('TAF ') + metar_station):
result_taf = row_taf[0]
await ctx.send(f'**METAR**: {result_metar}\n**TAF**: {result_taf}')
我真的希望有人能帮我解决这个问题。我已经为此工作了几个小时,但我真的被困在这里了。
非常感谢您的帮助和支持。
祝一切顺利!
有很多方法可以做到这一点,但为了方便和更好地理解,我使用 str.replace() 来替换特定单词,在它们之前添加“\n
”。
result_taf = result_taf.replace("BECMG","\nBECMG").replace("TEMPO","\nTEMPO").replace("PROB30","\nPROB30")
所以最终代码将是:(little edited)
@client.command(aliases=['METAR', 'TAF', 'taf'])
async def metar(ctx, *, metar_station):
#METAR
response = urlopen('https://www.aviationweather.gov/adds/dataserver_current/current/metars.cache.csv')
lines = [l.decode('utf-8') for l in response.readlines()]
cr = csv.reader(lines)
result_metar = [row[0] for row in cr if row[0].startswith(metar_station)][0]
#TAF
response_taf = urlopen('https://www.aviationweather.gov/adds/dataserver_current/current/tafs.cache.csv')
lines_taf = [l.decode('utf-8') for l in response_taf.readlines()]
cr_taf = csv.reader(lines_taf)
result_taf = [row[0] for row in cr_taf if row[0].startswith(f"TAF {metar_station}")][0]
result_taf = result_taf.replace("BECMG","\nBECMG").replace("TEMPO","\nTEMPO").replace("PROB30","\nPROB30")
await ctx.send(f'**METAR**: {result_metar}\n**TAF**: {result_taf}')
输出:
EHAM 080255Z 09001KT CAVOK 13/11 Q1018 NOSIG
TAF EHAM 072308Z 0800/0906 VRB03KT 9999 FEW030
BECMG 0806/0809 24007KT
PROB30
TEMPO 0812/0816 7000 -SHRA FEW025TCU
BECMG 0818/0821 VRB03KT PROB40 0822/0905 4500 BR
我目前正在开发航空天气 Discord 机器人,用户可以在其中请求机场的具体天气。因此,例如,当您输入:!metar KJFK
它应该 return METAR(气象机场报告)和 TAF(终端机场预报)。
此刻,我让它工作了,但它 return 是单行的。这是我进入阿姆斯特丹-史基浦国际民航组织站时得到的结果:
输入:!METAR EHAM
输出:
METAR: EHAM 071755Z 27008KT 230V300 9999 FEW030 19/11 Q1016 NOSIG
TAF: TAF EHAM 071707Z 0718/0824 26010KT 9999 FEW030 BECMG 0719/0722 19003KT BECMG 0812/0815 27008KT PROB30 TEMPO 0812/0816 7000 -SHRA FEW025TCU BECMG 0821/0824 23003KT
应该如何:
EHAM 071755Z 27008KT 230V300 9999 FEW030 19/11 Q1016 NOSIG
TAF EHAM 071707Z 0718/0824 26010KT 9999 FEW030
BECMG 0719/0722 19003KT
BECMG 0812/0815 27008KT
PROB30
TEMPO 0812/0816 7000 -SHRA FEW025TCU
BECMG 0821/0824 23003KT
所以在每个 'BECMG' 和 'TEMPO' 之后它从一个新行开始。我已经尝试了几个小时来解决这个问题。我还在学习所以我希望有人能够帮助我解决这个问题。
我目前的代码:
@client.command(aliases=['METAR', 'TAF', 'taf'])
async def metar(ctx, *, metar_station):
#METAR
url_metar = 'https://www.aviationweather.gov/adds/dataserver_current/current/metars.cache.csv'
response = urllib.request.urlopen(url_metar)
lines = [l.decode('utf-8') for l in response.readlines()]
cr = csv.reader(lines)
for row in cr:
if row[0].startswith(metar_station):
result_metar = row[0]
#TAF
url_taf = 'https://www.aviationweather.gov/adds/dataserver_current/current/tafs.cache.csv'
response_taf = urllib.request.urlopen(url_taf)
lines_taf = [l.decode('utf-8') for l in response_taf.readlines()]
cr_taf = csv.reader(lines_taf)
for row_taf in cr_taf:
if row_taf[0].startswith(str('TAF ') + metar_station):
result_taf = row_taf[0]
await ctx.send(f'**METAR**: {result_metar}\n**TAF**: {result_taf}')
我真的希望有人能帮我解决这个问题。我已经为此工作了几个小时,但我真的被困在这里了。
非常感谢您的帮助和支持。
祝一切顺利!
有很多方法可以做到这一点,但为了方便和更好地理解,我使用 str.replace() 来替换特定单词,在它们之前添加“\n
”。
result_taf = result_taf.replace("BECMG","\nBECMG").replace("TEMPO","\nTEMPO").replace("PROB30","\nPROB30")
所以最终代码将是:(little edited)
@client.command(aliases=['METAR', 'TAF', 'taf'])
async def metar(ctx, *, metar_station):
#METAR
response = urlopen('https://www.aviationweather.gov/adds/dataserver_current/current/metars.cache.csv')
lines = [l.decode('utf-8') for l in response.readlines()]
cr = csv.reader(lines)
result_metar = [row[0] for row in cr if row[0].startswith(metar_station)][0]
#TAF
response_taf = urlopen('https://www.aviationweather.gov/adds/dataserver_current/current/tafs.cache.csv')
lines_taf = [l.decode('utf-8') for l in response_taf.readlines()]
cr_taf = csv.reader(lines_taf)
result_taf = [row[0] for row in cr_taf if row[0].startswith(f"TAF {metar_station}")][0]
result_taf = result_taf.replace("BECMG","\nBECMG").replace("TEMPO","\nTEMPO").replace("PROB30","\nPROB30")
await ctx.send(f'**METAR**: {result_metar}\n**TAF**: {result_taf}')
输出:
EHAM 080255Z 09001KT CAVOK 13/11 Q1018 NOSIG
TAF EHAM 072308Z 0800/0906 VRB03KT 9999 FEW030
BECMG 0806/0809 24007KT
PROB30
TEMPO 0812/0816 7000 -SHRA FEW025TCU
BECMG 0818/0821 VRB03KT PROB40 0822/0905 4500 BR