求解答: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,是字符串,所以报错