我搜索并找到了检查对象类型的方法,但在这种情况下这对我没有帮助。我需要找出在实际执行之前是否可以将字符串更改为Integer。我正在使用pyautogui来抓取屏幕区域并保存它,然后pytesseract打开图像,读取它,并将其转换为字符串。最终它是一个我想要解决的等式,所以我必须将字符串更改为整数(在我的第二个函数中完成)。有时候pytesseract没有正确读取图像所以不用像5 + 4这样的东西,而是用5-H这样的东西,所以当我的代码试图把H变成一个整数时它会崩溃。
我的问题:如何在实际运行equation[0]
并导致我的脚本崩溃之前检查例如int(equation[0])
是否可以成为整数?
我的代码:简化为仅显示所需的行:
from PIL import Image
import PIL.ImageOps
import pytesseract
import pyautogui
import sys
import time
# --- functions ---
def get_text(image):
return pytesseract.image_to_string(image, config='-psm 6')
def get_int(image):
return int(get_text(image).replace(',', ''))
# --- main ---
#Is equation= needed below or can it be removed?
equation = pyautogui.screenshot('equation.png',region=(845, 262, 240, 85))
img = Image.open('equation.png')
equation = get_text(img)
print ('Equation:',equation)
#Numbers are always single digit (ex. 9-7=) Use slicing to pull numbers and symbol
firstnum = int(equation[0])
sign = equation[1]
secondnum = int(equation[2])
#Adition and Subtraction are the only options
if sign == '-':
answer = firstnum - secondnum
if sign =="+":
answer = firstnum + secondnum
编辑:
Try和Except似乎是处理这个问题的好方法。我可以以某种方式把它变成一个循环,所以它可以多次检查。我发现有人使用while true
作为一个循环,并尝试除了内部,我不知道是否会对我有用吗?以下是我认为我的尝试除外应该怎么看?如果可能的话,我想循环尝试,直到它没有遇到异常。
try:
firstnum = int(equation[0])
except:
equation = pyautogui.screenshot('equation.png',region=(845, 262, 240, 85))
img = Image.open('equation.png')
equation = get_text(img)
firstnum = int(equation[0])
答案 0 :(得分:2)
首先,如果这是一个数字,检查很简单:
if equation[0] in "0123456789":
firstnum = int(equation[0])
全字符串整数的实际检查功能是 isdigit 。
if equation[0].isdigit():
firstnum = int(equation[0])
另一种可能性是捕获异常:
try:
firstnum = int(equation[0])
except ... # you now have enough info to look this up.
解决循环问题
有关如何编码这些循环的一个示例,请参阅here。
在您的特定情况下,您只想使用从 get_text 获得不同结果所需的语句。拍摄新的屏幕截图真的会给你一个不同的结果吗? 任何会改变结果吗?你能保证你最终得到一个数字吗?如果没有,那么你还需要一个突破性条款,例如在七次尝试失败后放弃。
新代码看起来像下面的代码。请将变量更改为有意义的名称。最重要的是,在任何地方使用等式都会严重损害您的程序的可读性。
...
scan_result = get_text(img)
dgt = scan_result[0]
fail_count = 0
while not dgt.isdigit() and fail_count < 7:
fail_count += 1
pyautogui.screenshot('equation.png',region=(845, 262, 240, 85))
img = Image.open('equation.png')
scan_result = get_text(img)
dgt = scan_result[0]
if fail_count >= 7:
print ("I can't read that number")
else:
num1 = int(dgt)
另外,请注意您可能需要提取两个数字,并在您找到的两个单独数字的循环中运行它。你现在可以自己管理这部分吗?类似的东西:
digits = scan_result[0] + scan_result[-1]
for dgt in digits:
...
答案 1 :(得分:1)
您应该try
然后except
。
但如果你真的想提前赶上它,可以考虑使用正则表达式。 \d
相当于[0-9]
,因此数字可以匹配为[-+]?\d+
。
如果数字始终是一位数,请使用x in "0123456789"