Python 3在转换之前查找字符串是否可以转换为整数

Python 3在转换之前查找字符串是否可以转换为整数,python,pyautogui,Python,Pyautogui,我搜索并找到了检查对象类型的方法,但在这种情况下这对我没有帮助。在实际操作之前,我需要确定字符串是否可以更改为整数。我使用pyautogui获取屏幕的一个区域并保存它,然后pytesseract打开图像,读取它,并将其转换为字符串。最终,这是一个我想要解的方程,所以我必须将字符串改为整数(在下面的第二个函数中完成)。有时,pytesseract无法正确读取图像,因此它没有说5+4之类的话,而是说5-H之类的话,因此当我的代码试图将H转换为整数时,它会崩溃 我的问题:在实际运行int(等式[0])

我搜索并找到了检查对象类型的方法,但在这种情况下这对我没有帮助。在实际操作之前,我需要确定字符串是否可以更改为整数。我使用pyautogui获取屏幕的一个区域并保存它,然后pytesseract打开图像,读取它,并将其转换为字符串。最终,这是一个我想要解的方程,所以我必须将字符串改为整数(在下面的第二个函数中完成)。有时,pytesseract无法正确读取图像,因此它没有说5+4之类的话,而是说5-H之类的话,因此当我的代码试图将H转换为整数时,它会崩溃

我的问题:在实际运行
int(等式[0])
并导致脚本崩溃之前,如何检查例如
等式[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
编辑: 尝试和例外似乎是处理这个问题的好方法。我能不能把它变成一个循环,这样就可以检查多次。我发现有人使用了
,而true
作为循环,并将try-except放入内部,我不确定它是否适合我?以下是我认为我的尝试应该是什么样子?如果可能的话,我想循环尝试,直到它没有遇到异常

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])

首先,如果这是一个位数,检查很简单:

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.

循环问题的解决方案

有关如何对这些循环进行常规编码的示例,请参见

在您的特定情况下,您只需要使用从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)

首先,如果这是一个位数,检查很简单:

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.

循环问题的解决方案

有关如何对这些循环进行常规编码的示例,请参见

在您的特定情况下,您只需要使用从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)

你应该
试试
然后
除了

<>但是如果你真的想提前赶上它,考虑一个正则表达式。code>\d相当于
[0-9]
,因此数字可以匹配为
[-+]?\d+


如果数字总是一个位数,只需在“0123456789”中使用
x
您应该
尝试
然后
除了

<>但是如果你真的想提前赶上它,考虑一个正则表达式。code>\d
相当于
[0-9]
,因此数字可以匹配为
[-+]?\d+


如果数字总是一个位数,只需在“0123456789”中使用
x

您知道如何使用
试试
?您应该
尝试
对其进行解析,然后在异常失败时捕获异常。Python的座右铭之一是“请求原谅比允许更容易”。让它失败,如果失败了,就把它清理干净。我会回答这个问题,但我的问题几乎解决了。如果对象是字符串,那么它的类型就没有帮助。可能重复使用异常处理…这里有些东西没有意义。查看从未使用过的
equation=pyautogui.screenshot('equation.png',region=(84526224085))
,然后查看
equation=get_text(img)
。所以它被重新定义了。您确定您正在尝试索引正确的内容吗?您知道如何使用
try
?您应该
尝试
对其进行解析,然后在异常失败时捕获异常。Python的座右铭之一是“请求原谅比允许更容易”。让它失败,如果失败了,就把它清理干净。我会回答这个问题,但我的问题几乎解决了。如果对象是字符串,那么它的类型就没有帮助。可能重复使用异常处理…这里有些东西没有意义。查看从未使用过的
equation=pyautogui.screenshot('equation.png',region=(84526224085))
,然后查看
equation=get_text(img)
。所以它被重新定义了。你确定你在尝试索引正确的东西吗?你不需要
all(isdigit,…)
isdigit
不接受单个字符吗?@Carcigenicate:不,它对整个字符串进行操作。很好。。。但是这个应用程序只有一位数,有些地方对初始代码没有意义。查看从未使用过的
equation=pyautogui.screenshot('equation.png',region=(84526224085))
,然后查看
equation=get_text(img)
。所以它被重新定义了。@roganjosh:请把上面的评论移到主要问题上。你是对的,所以OP(和其他人)应该把它放在主要部分,而不是隐藏在我的答案下面。你不需要
all(isdigit,…)