求解答:TypeError: string indices must be integers

求解答:TypeError: string indices must be integers

问题描述:

手工录发票太慢了,主要是想获取到发票上的发票号和税额。
通过ocr识别接口,能过获取到发票的发票号和税额了,但是往表格写入的时候报错。

###源码如下:
import base64
import hashlib
import json
import os
import time
import ast
import requests
import xlrd
from xlutils import copy

# from urllib import parse

URL = "*****"
APPID = "*****"
API_KEY = "******"


def getHeader():
    curTime = str(int(time.time()))
    param = {"engine_type": "invoice"}
    param = json.dumps(param)
    # x_param = base64.b64encode(param.encode('utf-8'))
    # param = "{\"auto_rotate\":\"true\"}"
    paramBase64 = base64.b64encode(param.encode('utf-8'))

    m2 = hashlib.md5()
    str1 = API_KEY + curTime + str(paramBase64, 'utf-8')
    m2.update(str1.encode('utf-8'))
    checkSum = m2.hexdigest()

    header = {
        'X-CurTime': curTime,
        'X-Param': paramBase64,
        'X-Appid': APPID,
        'X-CheckSum': checkSum,
        'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
    }
    return header


filePath = 'pic'
pic_name = []
for i, j, name in os.walk(filePath):
    pic_name = name
pic_name_num = len(pic_name)

print("共识别到" + str(pic_name_num) + "张发票")

n = 0
while n <= pic_name_num:

    n += 1

    with open('pic/'+pic_name[n], 'rb') as f:
        f1 = f.read()

    f1_base64 = str(base64.b64encode(f1), 'utf-8')

    data = {
        'image': f1_base64
    }

        # headers=getHeader(language, location)
    r = requests.post(URL, data=data, headers=getHeader())
    result = r.text
    result = json.loads(result)
    data=result["data"]
   
    wb = xlrd.open_workbook('invoice.xls')
    sheet1 = wb.sheet_by_index(0)
    # 复制工作簿,得到工作表
    write_book = copy.copy(wb)
    write_sheet = write_book.get_sheet(0)
    # 写入内容到复制工作簿的表中
    list_num = sheet1.nrows
    write_sheet.write(list_num, 0, data['vat_invoice_daima'])
    write_sheet.write(list_num, 1, data['vat_invoice_tax_total'])
    # 往原路径上保存内容
    write_book.save('invoice.xls')

else:
    print('识别已结束')

input("Entry the any key to exit")

报错如下:
共识别到2张发票
Traceback (most recent call last):
  File "invoice.py", line 77, in <module>
    write_sheet.write(list_num, 0, data['vat_invoice_daima'])
TypeError: string indices must be integers

***Repl Closed***

data=result["data"] 获取的是字符串,不是字典,用 json.loads(result["data"]) 转换下试试

data=json.loads(result["data"])

如有帮助,望采纳!谢谢!

77行,当时的data应该不是dict,是字符串,所以报错