小编dnL*_*nLL的帖子

使用 aiohttp 从 Python 内存中上传 multipart/form-data

我正在尝试使用 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)

我认为我发送数据的方式有问题。我缺少什么?

python multipartform-data aiohttp discord.py

4
推荐指数
1
解决办法
3326
查看次数

Application.Calculation取决于工作簿

我正在管理一个包含超过 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 …

excel vba excel-2010

2
推荐指数
1
解决办法
4021
查看次数

优化Excel公式 - SUMPRODUCT与SUMIFS/COUNTIFS

根据几个网站,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公式通常更快.

excel formula excel-formula excel-2010

2
推荐指数
1
解决办法
2万
查看次数

提示保存Normal.dot

尝试手动关闭从我的VBA项目(实际使用Access 2003开发)创建的Word文档时,我遇到了一些问题.根据我使用的方法,它可能会提示保存Normal.dot,然后告诉我它已经打开或正在使用.这有点烦人,因为我无法关闭Microsoft Word.浪费时间.

ms-access vba templates ms-word

1
推荐指数
1
解决办法
2037
查看次数

使用 Discord API 处理错误 (on_error)

我从 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),而且我不知道如何正确格式化它。

python discord

0
推荐指数
1
解决办法
1万
查看次数