Python 3查找在转换之前是否可以将String转换为整数

时间:2017-03-20 19:35:19

标签: python pyautogui

我搜索并找到了检查对象类型的方法,但在这种情况下这对我没有帮助。我需要找出在实际执行之前是否可以将字符串更改为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])

2 个答案:

答案 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"