我正在尝试使用 Discord.py 将附件上传到 Ballchasing 的 API。以下是相关的 API 部分:
https://discordpy.readthedocs.io/en/latest/api.html#discord.Attachment.read
https://ballchasing.com/doc/api#upload-upload-post
文档中的示例建议使用请求,但我一遍又一遍地读到,这对于 Discord 机器人来说不是最佳实践,因为您希望异步代码以避免任何可能阻止脚本执行的情况。
这是我所拥有的:
@commands.Cog.listener()
async def on_message(self, message):
headers = {'Authorization':self.upload_key_bc}
for attachment in message.attachments:
file = io.BytesIO(await attachment.read())
action = {'file': ('replay.replay', file.getvalue())}
async with aiohttp.ClientSession() as session:
async with session.post(self.api_upload_bc, headers=headers, data=action) as response:
print(response.status)
print(await response.text())
Run Code Online (Sandbox Code Playgroud)
我收到这样的回复:
failed to get multipart form: request Content-Type isn't multipart/form-data
Run Code Online (Sandbox Code Playgroud)
我尝试将 Content-Type 标头强制为 multipath/form-data,但出现了不同的错误:
failed to get multipart form: no multipart boundary param in Content-Type
Run Code Online (Sandbox Code Playgroud)
我认为我发送数据的方式有问题。我缺少什么?
我正在管理一个包含超过 200 000 个公式(一些非常复杂的数组公式)的工作簿,这意味着我不能让 Excel 每次单击某个地方时自动计算所有单元格(计算所有内容大约需要 8 小时)。
取而代之的是,计算设置为手动,并且在打开Calculation.xlsm时执行了以下 VBA 代码:
With Application
.CalculateBeforeSave = False
.Calculation = xlCalculationManual
End With
Run Code Online (Sandbox Code Playgroud)
我使用自定义按钮在需要时仅计算 200k 单元格的某些部分。
我注意到 Excel 会跟踪每个工作簿中的设置,这意味着如果我打开我的 Calculation.xlsm,Excel 会记住计算设置为手动。如果我打开 Values.xlsx,Excel 会记住计算设置为自动。这是在我尝试将值从Calculation.xlsm复制到Values.xlsx 之前。
现在,因为我在 Calculation.xlsm 中使用 VBA 将值复制到 Values.xlsx,ExcelApplication.Calculation也会将该设置应用于该工作簿,这意味着如果我使用新的 Excel 实例打开它,计算仍将被设置手动。
如果我在我的Calculation.xlsm工作簿中使用 VBAApplication.Calculation = xlCalculationAutomatic关闭Values.xlsx之前添加一个,它将起作用,但 Excel 也将开始计算我的Calculation.xlsm工作簿中的 200k 单元格,这显然是我不想要的。
所以我的问题是关于如何根据特定的工作簿而不是Application对象来实际设置 Excel 的计算。这是基于这样一个事实,即 Excel 会根据打开的工作簿跟踪该设置(您只需进行测试并创建 2 个不同的.xlsx文件,一个启用计算,另一个禁用计算,Excel 将记住这些设置)。
我知道我可以Worksheets.Range.Calculate …
根据几个网站,SUMIFS和COUNTIFS比SUMPRODUCT更快(例如:http://exceluser.com/blog/483/excels-sumifs-or-sumproduct-which-is-faster.html ).我有一个行数未知(大约200 000)的工作表,我正在用数字计算性能报告.我有超过6000次几乎相同的SUMPRODUCT公式,每次都有几个不同(只有条件改变).
这是我得到的一个例子:
=IF(AFO4>0,
(SUMPRODUCT((Sheet1!$N:$N=$A4)
*(LEFT(Sheet1!$H:$H,2)="1A")
*(Sheet1!$M:$M<>"service catalog")
*(Sheet1!$J:$J="incident")
*(Sheet1!$I:$I<>"self-serve")
*(Sheet1!$AK:$AK=AFM$1)
*(Sheet1!$E:$E>=$E$1)
*(Sheet1!$E:$E<$E$2))
+SUMPRODUCT((Sheet1!$AJ:$AJ=$C4)
*(LEFT(Sheet1!$H:$H,2)="1A")
*(Sheet1!$M:$M<>"service catalog")
*(Sheet1!$J:$J="incident")
*(Sheet1!$I:$I="self-serve")
*(Sheet1!$AK:$AK=AFM$1)
*(Sheet1!$E:$E>=$E$1)
*(Sheet1!$E:$E<$E$2)))/AFO4,0)
Run Code Online (Sandbox Code Playgroud)
计算那件事需要1秒多一点.由于我有超过6000个公式,所以计算一切都需要一个多小时.
所以,我现在正在研究如何优化该公式.我可以将它转换为SUMIFS吗?会更快吗?我在这里加的是0和1,我只计算数据源(Sheet1)中满足条件集的行数.也许COUNTIFS会更好?
由于我们需要每个月执行一些公式,所以我希望获得一些执行时间.
如果有帮助我可以使用VBA,但我总是听说Excel公式通常更快.
尝试手动关闭从我的VBA项目(实际使用Access 2003开发)创建的Word文档时,我遇到了一些问题.根据我使用的方法,它可能会提示保存Normal.dot,然后告诉我它已经打开或正在使用.这有点烦人,因为我无法关闭Microsoft Word.浪费时间.
我从 Python 开始,目前正在使用 API 开发 Discord 机器人。到目前为止一切顺利,一切正常。现在,我希望在没有控制台的服务器上托管脚本,这意味着我希望输出进入文件而不是控制台。我目前有以下工作:
import discord
import logging
logging.basicConfig(filename='.\output.log', filemode='w', level=logging.INFO, format='%(asctime)s:%(levelname)s:%(message)s')
xzbot = discord.Client()
# logging when the bot starts
@xzbot.event
async def on_ready():
logging.info('Logged in as ' + xzbot.user.name + ' (' + xzbot.user.id + ')\n')
Run Code Online (Sandbox Code Playgroud)
所以这段代码会将所有警告和信息放入output.log中。话虽如此,它不适用于 Discord.py 引发的异常,例如当机器人尝试在没有权限的情况下发送消息时“权限被拒绝”。
Discord API 中有一个内置函数可以处理这个问题:
discord.on_error(event, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
所以我可以这样调用这个函数:
async def xzbot.on_error(event, *args, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
现在,我尝试使用event,*args或者做一些事情,**kwargs但我需要一些帮助才能以我可以使用 的格式获得它logging.warning()。我所能得到的只是objecta 的结果print(*args),而且我不知道如何正确格式化它。