Python实现批量识别银行卡号码以及自动写入Excel表格步骤详解
准备工作
在开始编写代码之前,需要安装以下库:
- requests:用于发送HTTP请求
- xlwt、xlrd:用于读写Excel文件
- pillow:用于图像处理
安装方式:
pip install requests xlrd xlwt pillow
同时,还需要下载 tesseract-ocr 软件进行安装,并将其加入环境变量中。tesseract-ocr 用于文字识别。
代码编写
1. 获取银行卡号码
首先,我们需要从银行卡图片中获取银行卡号码。我们可以将图片上传到第三方 OCR 识别平台,或者使用 tesseract-ocr 进行本地文字识别。这里我们使用第一种方式,将图片上传到阿里云的 OCR 识别接口。
import os
import base64
import requests
import json
# 图片路径
image_path = 'bankcard.jpg'
# 阿里云 OCR 接口 URL
ocr_url = 'https://ocrapi- general. m.taobao.com/ocrservice/ general'
# 阿里云 appcode
appcode = 'your_appcode'
# 打开图片文件
try:
with open(image_path, 'rb') as f:
image_data = f.read()
except Exception as e:
print('图片文件打开失败!', str(e))
exit()
# 将图片数据转成 Base64 编码
image_base64 = base64.b64encode(image_data).decode('utf-8')
# 构造请求参数
param = {'img': image_base64}
# 发送 POST 请求
header = {'Authorization': 'APPCODE ' + appcode}
response = requests.post(ocr_url, headers=header, data=param)
response.encoding = 'utf-8'
result = json.loads(response.text)
# 银行卡号码
card_number = None
# 从结果中获取银行卡号码
if 'ret' in result:
for item in result['ret']:
if 'word' in item and '卡号' in item['word']:
card_number = item['itemstring']
# 打印银行卡号码
print(card_number)
2. 写入 Excel 文件
接下来,我们将获取到的银行卡号码写入 Excel 文件中。我们使用 xlwt 库来创建并写入 Excel 文件。
import os
import base64
import requests
import json
import xlwt
# 图片路径
image_path = 'bankcard.jpg'
# Excel 文件名
excel_file = 'bankcards.xls'
# 阿里云 OCR 接口 URL
ocr_url = 'https://ocrapi- general. m.taobao.com/ocrservice/ general'
# 阿里云 appcode
appcode = 'your_appcode'
# 打开图片文件
try:
with open(image_path, 'rb') as f:
image_data = f.read()
except Exception as e:
print('图片文件打开失败!', str(e))
exit()
# 将图片数据转成 Base64 编码
image_base64 = base64.b64encode(image_data).decode('utf-8')
# 构造请求参数
param = {'img': image_base64}
# 发送 POST 请求
header = {'Authorization': 'APPCODE ' + appcode}
response = requests.post(ocr_url, headers=header, data=param)
response.encoding = 'utf-8'
result = json.loads(response.text)
# 银行卡号码
card_number = None
# 从结果中获取银行卡号码
if 'ret' in result:
for item in result['ret']:
if 'word' in item and '卡号' in item['word']:
card_number = item['itemstring']
# 写入 Excel 文件
if card_number is not None:
# 创建 Excel 文件
workbook = xlwt.Workbook(encoding='utf-8')
sheet = workbook.add_sheet('银行卡号码')
# 写入表头
sheet.write(0, 0, '银行卡号码')
# 写入数据
sheet.write(1, 0, card_number)
# 保存 Excel 文件
workbook.save(excel_file)
print('银行卡号码写入Excel成功!')
else:
print('未能获取银行卡号码!')
示例说明
示例一
假设我们有一批银行卡图片,存放在 bankcards
文件夹中,我们可以使用以下代码对其中的每张图片进行处理,并将结果写入 Excel 文件中。
import os
import base64
import requests
import json
import xlwt
# 图片目录
image_dir = 'bankcards'
# Excel 文件名
excel_file = 'bankcards.xls'
# 阿里云 OCR 接口 URL
ocr_url = 'https://ocrapi- general. m.taobao.com/ocrservice/ general'
# 阿里云 appcode
appcode = 'your_appcode'
# 处理一张图片
def process_image(image_path):
# 打开图片文件
try:
with open(image_path, 'rb') as f:
image_data = f.read()
except Exception as e:
print('图片文件打开失败!', str(e))
return None
# 将图片数据转成 Base64 编码
image_base64 = base64.b64encode(image_data).decode('utf-8')
# 构造请求参数
param = {'img': image_base64}
# 发送 POST 请求
header = {'Authorization': 'APPCODE ' + appcode}
response = requests.post(ocr_url, headers=header, data=param)
response.encoding = 'utf-8'
result = json.loads(response.text)
# 银行卡号码
card_number = None
# 从结果中获取银行卡号码
if 'ret' in result:
for item in result['ret']:
if 'word' in item and '卡号' in item['word']:
card_number = item['itemstring']
return card_number
# 处理所有图片
card_numbers = []
for filename in os.listdir(image_dir):
if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'):
image_path = os.path.join(image_dir, filename)
card_number = process_image(image_path)
if card_number is not None:
card_numbers.append(card_number)
print('处理图片', filename, '成功!')
else:
print('处理图片', filename, '失败!')
# 写入 Excel 文件
if len(card_numbers) > 0:
# 创建 Excel 文件
workbook = xlwt.Workbook(encoding='utf-8')
sheet = workbook.add_sheet('银行卡号码')
# 写入表头
sheet.write(0, 0, '银行卡号码')
# 写入数据
for i in range(len(card_numbers)):
sheet.write(i+1, 0, card_numbers[i])
# 保存 Excel 文件
workbook.save(excel_file)
print('银行卡号码写入Excel成功!')
else:
print('未能获取任何银行卡号码!')
示例二
假设我们需要在一个 Web 应用程序中使用此功能,让用户上传银行卡图片并进行识别,并显示结果和下载 Excel 文件。我们可以使用以下代码进行实现。这里我们使用 flask 框架。
import os
import base64
import requests
import json
import xlwt
from flask import Flask, request, render_template, send_file, redirect
app = Flask(__name__)
# 首页
@app.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'GET':
return render_template('index.html')
elif request.method == 'POST':
# 获取上传的文件
file = request.files.get('file')
if not file:
return render_template('index.html', error='请选择文件!')
# 保存文件
save_path = os.path.join('static', 'uploads', file.filename)
file.save(save_path)
# 处理文件
card_number = process_image(save_path)
# 返回结果
if card_number is not None:
return render_template('result.html', card_number=card_number)
else:
return render_template('result.html', error='未能获取银行卡号码!')
# 下载 Excel 文件
@app.route('/download', methods=['GET'])
def download():
# 写入 Excel 文件
card_numbers = []
for filename in os.listdir(os.path.join('static', 'uploads')):
if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'):
image_path = os.path.join('static', 'uploads', filename)
card_number = process_image(image_path)
if card_number is not None:
card_numbers.append(card_number)
if len(card_numbers) > 0:
# 创建 Excel 文件
excel_file = 'static/bankcards.xls'
workbook = xlwt.Workbook(encoding='utf-8')
sheet = workbook.add_sheet('银行卡号码')
# 写入表头
sheet.write(0, 0, '银行卡号码')
# 写入数据
for i in range(len(card_numbers)):
sheet.write(i+1, 0, card_numbers[i])
# 保存 Excel 文件
workbook.save(excel_file)
# 返回 Excel 文件
return send_file('static/bankcards.xls', as_attachment=True)
else:
return redirect('/')
# 处理图片
def process_image(image_path):
# 打开图片文件
try:
with open(image_path, 'rb') as f:
image_data = f.read()
except Exception as e:
print('图片文件打开失败!', str(e))
return None
# 将图片数据转成 Base64 编码
image_base64 = base64.b64encode(image_data).decode('utf-8')
# 构造请求参数
ocr_url = 'https://ocrapi- general. m.taobao.com/ocrservice/ general'
appcode = 'your_appcode'
param = {'img': image_base64}
header = {'Authorization': 'APPCODE ' + appcode}
# 发送 POST 请求
response = requests.post(ocr_url, headers=header, data=param)
response.encoding = 'utf-8'
result = json.loads(response.text)
# 银行卡号码
card_number = None
# 从结果中获取银行卡号码
if 'ret' in result:
for item in result['ret']:
if 'word' in item and '卡号' in item['word']:
card_number = item['itemstring']
return card_number
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
这样,我们就可以在 Web 应用程序中使用银行卡识别和写入 Excel 的功能了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现批量识别银行卡号码以及自动写入Excel表格步骤详解 - Python技术站