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