0

私はpy2exeで実行可能ファイルに変換されたPython 2.7のスクリプトを持っています。INPUT データは、この関数に続いて区切り文字が有効である必要があるテキスト ファイルです。

# 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 のエレガントな方法で 2 つのソリューションを探しています。

  • 正しい INPUT データがロードされない限り、OUTFILE に渡すことはできません

また

  • スクリプトはコードを壊し、エラーを表示しますが、ウィンドウ (*.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 ファイルのウィンドウが閉じて、ユーザーは説明なしで終了します。

4

2 に答える 2

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()
于 2013-04-05T17:29:07.940 に答える
1

を使用して、キャッチされていない例外の例外ハンドラーをフックし、この回答に従って(または3.x で)sys.excepthook呼び出すことができます。raw_input()input()

簡単な例:

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...")は、すでに持っているソリューションを入れるだけで問題ありません。上記は、より一般的な解決策を提供するはずです。

于 2013-04-05T17:12:19.617 に答える