You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python 3读取API密钥文件出现方括号致API签名错误求助

解决从文件读取API密钥时的列表格式问题

嘿,我完全懂你的困扰!从文件读取密钥时得到带方括号的列表,而不是纯字符串,这就是API签名报错的根源——因为签名算法需要的是字符串格式的密钥,而不是列表。

问题原因

你用了readline().splitlines(),这个方法的返回值是列表类型,哪怕文件里只有一行内容,它也会把这行包装成一个单元素列表,所以你看到的['Your API Key']就是这个结果。而硬编码时你直接赋值的是字符串,格式匹配,所以API调用正常。

快速解决方案

有两种简单的方法可以把列表转成纯字符串:

方法1:直接取列表的第一个元素

因为你每次readline()只读取一行,splitlines()返回的列表里只有一个元素,直接通过索引[0]取出即可:

def connect():
    f = open("Test-API.txt", "r")
    if f.mode == 'r':
        api_key = f.readline().splitlines()[0]
        api_secret = f.readline().splitlines()[0]
        print(repr(api_key))  # 输出:'Your API Key'
        print(repr(api_secret)) # 输出:'Your API Secret'
    f.close()
    
    # 硬编码对比测试
    api_key = 'Your API Key'
    api_secret = 'Your API Secret'
    print(repr(api_key))
    print(repr(api_secret))
connect()

方法2:用strip()替代splitlines()(更推荐)

readline()会读取到换行符\n,用strip()可以直接去掉字符串首尾的空白字符(包括换行符),同时直接得到字符串类型的结果,不需要处理列表:

def connect():
    f = open("Test-API.txt", "r")
    if f.mode == 'r':
        api_key = f.readline().strip()
        api_secret = f.readline().strip()
        print(repr(api_key))  # 输出:'Your API Key'
        print(repr(api_secret)) # 输出:'Your API Secret'
    f.close()
    
    # 硬编码对比测试
    api_key = 'Your API Key'
    api_secret = 'Your API Secret'
    print(repr(api_key))
    print(repr(api_secret))
connect()

更健壮的写法:使用with语句

处理文件时,推荐用with语句,它会自动帮你关闭文件,避免忘记close()导致的资源泄漏:

def connect():
    with open("Test-API.txt", "r") as f:
        api_key = f.readline().strip()
        api_secret = f.readline().strip()
        print(repr(api_key))
        print(repr(api_secret))
    
    # 硬编码对比测试
    api_key = 'Your API Key'
    api_secret = 'Your API Secret'
    print(repr(api_key))
    print(repr(api_secret))
connect()

替换后,你读取到的密钥就和硬编码的格式完全一致了,API签名应该就能正常通过啦!

内容的提问来源于stack exchange,提问作者Caulinez

火山引擎 最新活动