0

そのため、inFileテキストを1行ずつ読み取るコードを取得しようとしています。各行を分割してから、有効かどうかのチェックを実行する必要があります。何らかの理由で、最後の行のみを読み取り、outFile 00-7141858-X に出力するため、最初にそこに到達するために各行ごとに読み取りを行っていると想定しています。しかし、最後の行のプロセスを通過しただけですか?

019-923-3241
818-851-703X
5703781188
031-X287085-
00-7141858-X

アウトファイルを次のようにしたい

019-923-3241 - 有効
818-851-703X - 無効
5703781188 - 有効
031-X287085- 無効
00-7141858-X - 有効

ありがとう!

def pre_process (processed_S):
    st = ''
    for ch in processed_S:
       if ch == '-':
           st = st + ''
       else:
           st = st + ch
    return st   

def digit_check (processed_S):
    digit_nums = '0123456789Xx'
    nums = set(digit_nums)
    for ch in processed_S:
        if not ch in nums:
            print ("Invalid ISBN")
    return processed_S

def length_check(processed_S):
    if len(processed_S) < 10 or len(processed_S) > 10:
        print ("Invalid ISBN")

def value_placement (processed_S):
    first_nine = '0123456789'
    nums2 = set (first_nine)
    for ch in range(len(processed_S) - 1):
        if not str(ch) in nums2:
           print ("Invalid ISBN")
    return processed_S

def check_x (processed_S):
    last_letter = '0123456789Xx'
    nums3 = set (last_letter)
    if not str(processed_S[-1]) in nums3:
            print ("Invalid ISBN")
    return processed_S

def main():

    inFile = open ('isbn.txt', 'r')
    outFile = open ('isbnOut.txt', 'w')
    for line in inFile:
        line = line.strip()
    processed_S = pre_process (line)
    st = digit_check (processed_S)
    st2 = length_check (processed_S)
    st3 = value_placement (processed_S)
    st4 = check_x (processed_S)
    count = 0
    s2 = []
    for i in processed_S:
        if i.isdigit():
            count += int(i)
            s2.append(count)
        if i == 'X':
            i = '10'
            count += int(i)
            s2.append(count)
    s2_count = 0
    for j in s2:
        if i.isdigit():
            s2_count += int(j)
    if s2_count % 11 != 0:
        outFile.write(processed_S)
        outFile.write(" - Invalid\")
    else:
        outFile.write(processed_S)
        outFile.write(" - valid\n")

    inFile.close()
    outFile.close()

主要()

4

3 に答える 3

2

もうすぐです。ただし、追加するのではなく、ファイルに書き込む必要があります。そして、改行を忘れないでください。

outFile.write(processed_S)
outFile.write(" - Invalid\n")
于 2013-08-09T23:52:31.700 に答える
0

コードにはいくつかの問題があります。あなたが求めているのは、インデントの問題によるものです。入力ファイルから読み取るコード内のループは次のとおりです。

for line in inFile:
    line = line.strip()
processed_S = pre_process (line)

これはstrip各行でのみ実行し、後で結果を破棄します。呼び出しはループが終了したpre_process後にのみ実行され、最後に指定された値でのみ実行lineされます。

これを修正するには、processed_S = preprocess (line)行と次の行のほとんどをインデントして、 と同じレベルになるようにする必要がありますline = line.strip()

その他の問題:

  1. さまざまなwhatever_check関数は、チェックが失敗した場合に出力するだけで何もしません (複数回出力される場合もあります!)。おそらく、入力された文字列を出力して返すのではなく、Trueまたは値を返すようにする必要があります。False

  2. digit_checkvalue_placementまたは のいずれかが失敗する場合にのみ失敗check_xします。おそらく、3 つすべてを用意する必要はありません (後者の 2 つを保持するか、すべてをテストする 1 つの関数を作成するだけです)。all(c in digits for c in s[:-1]) and s[-1] in (digits + 'X')すべてのテストを 1 行で行うようなものです。

実際には間違っていないが、改善される可能性があるその他のもの:

  1. 独自の手動呼び出しwithに頼るのではなく、ステートメントを使用して、ファイルの処理が完了した後にファイルが確実に閉じられるようにします。close

    with open ('isbn.txt', 'r') as infile, open ('isbnOut.txt', 'w') as outfile:
        # the rest
    
  2. ISBN チェックサムを追加するループは単純化できます。

    checksum = t = 0
    for c in processed_S:
        if c.isdigit():
            t += int(c)
        else: # c must be X, or a previous test should have failed
            t += 10
        checksum += t
    
    if checksum % 11 == 0:
        # valid
    
  3. おそらく、チェックサム テストは とは別の関数に入る必要がありますmain。さらに、それと妥当性のために持っている他のテストvalid_isbnは、前処理とすべてのチェックを処理するより高いレベルの関数から呼び出す必要があります。これmainにより、大幅に簡素化されます。理想的には:

    def main():
        with open ('isbn.txt', 'r') as infile, open ('isbnOut.txt', 'w') as outfile:
        for line in infile:
            if verify_isbn(line):
                outfile.write(line.strip() + " - valid\n")
            else:
                outfile.write(line.strip() + " - invalid\n")
    
于 2013-08-10T01:42:55.273 に答える
-1

解決策はよく覚えていませんが、これで解決したようです。ソリューションを修正するために戻ってきました。

def pre_process (processed_S):
   st = ''
   for ch in processed_S:
       if ch == '-':
           st = st + ''
       else:
           st = st + ch
   return st   

def digit_check (processed_S):
    digit_nums = '0123456789Xx'
    nums = set(digit_nums)
    for ch in processed_S:
        if not ch in nums:
            print ("Invalid ISBN")
    return processed_S

def length_check(processed_S):
    if len(processed_S) < 10 or len(processed_S) > 10:
        print ("Invalid ISBN")

def value_placement (processed_S):
    first_nine = '0123456789'
    nums2 = set (first_nine)
    for ch in range(len(processed_S) - 1):
        if not str(ch) in nums2:
            print ("Invalid ISBN")
    return processed_S

def check_x (processed_S):
    last_letter = '0123456789Xx'
    nums3 = set (last_letter)
    if not str(processed_S[-1]) in nums3:
            print ("Invalid ISBN")
    return processed_S

def main():

    inFile = open ('isbn.txt', 'r')
    outFile = open ('isbnOut.txt', 'w')
    for line in inFile:
        line = line.strip()
        processed_S = pre_process (line)
        st = digit_check (processed_S)
        st2 = length_check (processed_S)
        st3 = value_placement (processed_S)
        st4 = check_x (processed_S)
        count = 0
        s2 = []
        for i in processed_S:
            if i.isdigit():
                count += int(i)
                s2.append(count)
            if i == 'X':
                i = '10'
                count += int(i)
                s2.append(count)
        s2_count = 0
        for j in s2:
            if i.isdigit():
                s2_count += int(j)
        if s2_count % 11 != 0:
            outFile.write(processed_S)
            outFile.write(" - Invalid\n")
        else:
            outFile.write(processed_S)
            outFile.write(" - valid\n")
    inFile.close()
    outFile.close()

main()
于 2013-08-10T00:29:56.030 に答える