2016-11-17 40 views
-1

我与它带给我的X,Y坐标和情节号码map.Ex代码工作:地块编号20,21,22等,但如果地图有字母数字值像20A,20A或20 A,我被卡住了,因为当我输入像20-A这样的值时,我得到这个错误“ValueError:无效文字为int()与基10”。所以请帮助我如何处理字母数字值。ValueError:以10为基数的int()无效文字。如何修复字母数字值?

这是我的代码。

import matplotlib.pyplot as plt 
from PIL import Image 
import numpy as np 
import Tkinter as tk 
import tkSimpleDialog 

#Add path of map file here. The output will be saved in the same path with name map_file_name.extension.csv 
path = "maps/21.jpg" 


#Set this to true for verbose output in the console 
debug = False 


#Window for pop ups 
root = tk.Tk() 
root.withdraw() 
root.lift() 
root.attributes('-topmost',True) 
root.after_idle(root.attributes,'-topmost',False) 


#Global and state variables 
global_state = 1 
xcord_1, ycord_1, xcord_2, ycord_2 = -1,-1,-1,-1 
edge1, edge2 = -1,-1 

#Defining Plot 
img = Image.open(path) 
img = img.convert('RGB') 
img = np.array(img) 

if(debug): 
    print "Image Loaded; dimensions = " 
    print img.shape 

#This let us bind the mouse function the plot 
ax = plt.gca() 
ax.axes.get_xaxis().set_visible(False) 
ax.axes.get_yaxis().set_visible(False) 
fig = plt.gcf() 
#Selecting tight layout 
fig.tight_layout() 
#Plotting Image 
imgplot = ax.imshow(img) 

#Event listener + State changer 
def onclick(event): 
    global xcord_1,xcord_2,ycord_1,ycord_2,edge1,edge2, imgplot,fig, ax, path 
    if(debug): 
     print "Single Click Detected" 
     print "State = " + str(global_state) 
    if event.dblclick: 
     if(debug): 
      print "Double Click Detection" 
     global global_state 
     if(global_state==0): 


      xcord_1 = event.xdata 
      ycord_1 = event.ydata 

      edge1 = (tkSimpleDialog.askstring("2nd", "No of 2nd Selected Plot")) 
      #Draw here 
      if edge1 is None: #Incase user cancels the pop up. Go to initial state 
       global_state = 1 
       pass 
      else: 
       edge1 = int(edge1) 
       global_state = 1 
       difference = edge2-edge1 
       dif_state = 1; 
       #So difference is always positive. Dif_state keeps track of plot at which side has the larger number 
       if difference <0: 
        dif_state = -1; 
        difference *= -1 
       #Corner Case; labelling a single plot 
       if(difference == 0): 
        import csv 
        fields = [int(xcord_1),int(ycord_1),edge1] 
        plt.scatter(int(xcord_1),int(ycord_1),marker='$' + str(edge1) + '$', s=150) 
        with open(path+'.csv', 'a') as f: 
         writer = csv.writer(f) 
         writer.writerow(fields) 
       else: 
        if(debug): 
         print "P1 : (" + str(xcord_1) + ", " + str(ycord_1) + ")" 
         print "P2 : (" + str(xcord_2) + ", " + str(ycord_2) + ")" 
        for a in range(0,difference+1): 
         #Plotting the labels 
         plt.scatter(int(xcord_1+(a*(float(xcord_2-xcord_1)/difference))),int(ycord_1+a*((float(ycord_2-ycord_1)/difference))),marker='$'+str(edge1+dif_state*a)+'$',s=150) 
         #Saving in CSV 
         import csv 
         fields = [int(xcord_1+(a*(float(xcord_2-xcord_1)/difference))),int(ycord_1+a*((float(ycord_2-ycord_1)/difference))),str(edge1+dif_state*a)] 
         with open(path+'.csv', 'a') as f: 
          writer = csv.writer(f) 
          writer.writerow(fields) 

         if debug: 
          print (int(xcord_1+(a*(float(xcord_2-xcord_1)/difference))),int(ycord_1+a*((float(ycord_2-ycord_1)/difference)))) 
       plt.show() 



     elif(global_state == 1): 
      xcord_2 = event.xdata 
      ycord_2 = event.ydata 
      print "Recorded" 
      edge2 = (tkSimpleDialog.askstring("1st", "No of Selected Plot")) 
      print type(edge2) 
      if edge2 is None: 
       root.withdraw() 
       pass 
      else: 
       edge2 = int(edge2) 
       global_state = 0 



cid = fig.canvas.mpl_connect('button_press_event', onclick) 
plt.show() 
+0

你期望发生,如果值是“20-A”?你想将其转换为整数“20”吗? –

+0

没有我想输入的精确值,即“20-A”,但是当i型20-A然后我得到错误。现在,我可以只输入整数,我想输入整数和字母数字值 – Zeeshan

+0

如果你输入“20-A2”?你期望得到什么号码? 20? 202?一个20,2的列表? –

回答

0

可以使用split功能20-A分成20和A.

例如,"20-A".split('-')将返回['20','A']。然后,您可以调用这个数组的第一个元素上int方法

+0

thanku先生u能告诉我在哪里,我是新来这个或进行更改,让我做的工作代码更改代码才能使用此功能。 – Zeeshan

0

通用的方法将使用regex从文本中提取数字。

例如:

import re 

def get_number_from_string(my_str): 
    return re.findall('\d+', my_str) 

这将提取所有字符串中的数字并返回作为list

如果你只需要一个值,在指数0提取数量。样品运行:

>>> get_number_from_string('20-A') 
['20'] 
>>> get_number_from_string('20 A') 
['20'] 
>>> get_number_from_string('20A') 
['20'] 

因此,你的代码数量字符串转换为int应该是这样的:

number_string = get_number_from_string('20A')[0] # For getting only 1st number from list 
number = int(number_string) # Type-cast it to int  
+0

非常感谢你的回答,你可以修改代码并发布。 – Zeeshan

+0

我还没有检查完整的代码。我回答你的问题:*“但是如果地图有字母数字值像20A,20A或20A,我坚持,因为当我输入像20A值” *这是你的代码,你知道在哪里把这个:) –

相关问题