2013-04-05 72 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