首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3查找字符串在转换前是否可以转换为整数

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

Stack Overflow用户
提问于 2017-03-20 19:35:19
回答 2查看 707关注 0票数 1

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

我的问题:如何检查,例如,在实际运行int(equation[0])并导致脚本崩溃之前,equation[0]是否可以成为整数?

My代码:大大简化为只显示所需的行:

代码语言:javascript
复制
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

编辑:尝试,除了似乎是一个很好的方法来处理这件事。我能不能把它变成一个循环,这样它就可以被检查多次了。我发现有人使用while true作为一个循环,并将尝试除了内部,我不确定是不是会对我的工作呢?以下是我认为我的尝试除了应该看上去如何?如果可能的话,我想循环一下try,直到它没有遇到异常。

代码语言:javascript
复制
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])
EN

回答 2

Stack Overflow用户

发布于 2017-03-20 19:37:39

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

代码语言:javascript
复制
if equation[0] in "0123456789":
    firstnum = int(equation[0])

对全字符串整数的实际检查函数是等位数.

代码语言:javascript
复制
if equation[0].isdigit():
    firstnum = int(equation[0])

另一种可能是抓住例外:

代码语言:javascript
复制
try:
    firstnum = int(equation[0])
except ... # you now have enough info to look this up.

循环问题的

有关如何对这些循环进行一般编码的一个示例,请参阅here

在您的具体情况下,您只想使用与get_text不同的结果所需的语句。拍一张新的屏幕照片真的会给你带来不同的结果吗?有什么能改变结果吗?你能保证你最终会得到一个数字吗?如果没有,那么您还需要一个例外条款,例如在七次失败的尝试之后放弃。

新代码将类似于下面的代码。请将变量更改为有意义的名称。最重要的是,在任何地方使用等式都会损害程序的可读性。

代码语言:javascript
复制
... 
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)

另外,请注意,您可能希望提取两个数字,并在您找到的两个单独数字上的一个循环中运行这一点。你现在能自己处理这部分了吗?类似于:

代码语言:javascript
复制
digits = scan_result[0] + scan_result[-1]
for dgt in digits:
    ...
票数 3
EN

Stack Overflow用户

发布于 2017-03-20 19:50:07

你应该try然后except

但是,如果你真的想提前抓住它,考虑一个正则表达式。\d等同于[0-9],所以数字可以匹配为[-+]?\d+

如果数字总是单数,只需使用x in "0123456789"

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42912460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档