2013-04-05 31 views
0

我有一個Python 2.7腳本,它可以用py2exe轉換成可執行文件。輸入數據是在分隔符必須是有效的下面這個函數的文本文件:阻止命令關閉當發生「異常」時提示用Python提示

# Check if delimeter is valid 
def get_parse(filename, delimiters=['\t', ',', ' ', ':', ';', '-']): 
    with open(filename) as f: 
     f.next() 
     secondline = f.next() 
    for delimiter in delimiters: 
     if len(secondline.rstrip().split(delimiter)) >= 3: 
      return delimiter 
    raise Exception("couldn't find a delimiter that worked!") 

當分隔符是無效的:我是一個Python優雅的方式找兩個解決方案(例如點):

  • 直到右輸入數據不被加載,你不能傳遞到outfile

  • 腳本破解代碼,顯示錯誤,但Windows(當是 * .EXE)不使用此解決方案立即關閉更讓用戶沒有解釋

INPUT = raw_input("Input (*.txt): ") 
while not os.path.exists(INPUT): 
     print IOError("No such file or directory: %s" % INPUT) 
     INPUT = raw_input("Input (*.txt): ") 
try: 
    parse = get_parse(INPUT) 
except Exception: 
    print ValueError("Delimiter type not valid") 
    break 
OUTPUT = raw_input("Output (*.txt): ") 

(打破)我的* .exe文件的窗口關閉留給用戶無需解釋

+0

感謝怪異,但是輸入的第二次你去OUTPUT :)的 – 2013-04-05 15:43:23

+0

可能重複[如何保持一個Python腳本輸出窗口打開?](http://stackoverflow.com/questions/1000900/如何保持一個python腳本輸出窗口打開) – Kevin 2013-04-05 16:47:35

回答

1

您可以使用掛鉤爲sys.excepthook未捕獲的異常異常處理程序,並將它調用3.X raw_input()(或input())按this answer

對於一個簡單的例子:

import sys 
def wait_on_uncaught_exception(type, value, traceback): 
    print 'My Error Information' 
    print 'Type:', type 
    print 'Value:', value 
    print 'Traceback:', traceback 
    raw_input("Press any key to exit...") 
sys.excepthook=wait_on_uncaught_exception 

就修改有任何輸出或任何你想要的(我建議尋找到traceback模塊)。

但是,如果您希望它更具體到您的代碼,那麼只需將raw_input("Press any key to exit...")放在您已有的解決方案中,並且應該沒問題。以上應該提供更一般的解決方案。

+0

不錯。這是一個很好的起點工作 – 2013-04-05 17:21:40

+0

一個可能的解決方案是增加: 的raw_input(「按任意鍵退出」)
打印「退出.....」
突破 – 2013-04-05 17:34:57

+0

@Gianni - 他們永遠不會看到最後''退出.....「'因爲['只有當整個堆棧解開並且在程序退出之前沒有找到異常處理程序時才調用'sys.excepthook'。](http://stackoverflow.com/ a/11365708/786020)它會打印並放棄太快,以致用戶看不到,這是您的原始問題。 – Poik 2013-04-05 17:41:57

1

你並不是真的在尋找一個分隔符,只是一個字符串中的一個字符。你應該真的使用CSV模塊來做到這一點。

from __future__ import print_function 

delimiters=['\t', ',', ' ', ':', ';', '-'] 

def getfile(): 
    fname ="" 
    while fname is "": 
      fname = str.lower(raw_input("Input(*.txt): ")) 
      while fname.endswith(".txt") is not True: 
        print ("File must be .txt") 
        fname = str.lower(raw_input("Input(*.txt): ")) 
      if fname.endswith(".txt"): 
       try: 
        with open(fname,'rb') as f: 
         parsed = False 
         while not parsed: 
          data = f.readline() 
          for d in delimiters: 
           if d in data: 
            print ("Delimiter: {0} found".format(d)) 
            parsed = True 
            # do your additional stuff here 
           else: 
            print ("Unable to find delimiter {0}".format(d)) 
            parsed = True 
       except IOError as e: 
        print("Error: ", e) 

getfile() 
+0

一個可能的解決方案是添加:raw_input(「按任意鍵退出」 )
print「Exiting .....」
break – 2013-04-05 17:36:10

+0

這不是一個可以解決的問題:''直到正確的INPUT數據沒有加載,你不能傳遞給OUTFILE「'AND'」腳本破壞代碼,顯示錯誤,但窗口(當是* .exe時)不會立即關閉,離開用戶而沒有解釋「'。是的,如果你想要做的只是在錯誤發生後保持窗口打開,一個'raw_input('...')'就足夠了,但是你也要求沒有任何事情發生,除非正確的輸入文件被加載。使用我提供的代碼片段,除非它有一個帶'txt'擴展名(符合您的請求)的文件,否則什麼也不會發生。 – serk 2013-04-05 21:29:39