2

教科書のチュートリアル「Python 2nd edition から始める」に従っていますが、IDLE 3.2 でこの演習でトレースバックを取得しています。問題を理解できないようです。販売数を入力してから、「sales.txtに書き込まれたデータ」と表示される販売額を1つだけ入力できます。その後、2 日目のプロンプトが表示されますが、金額を入力するとトレースバックが発生します。

行 118、メインの sales_file.write(str(sales) + '\n') ValueError: 閉じたファイルに対する I/O 操作。

コード:

def main():

     num_days = int(input('For how many days do ' + \
                          'you have sales? '))

     sales_file = open('sales.txt', 'w')


     for count in range(1, num_days + 1):
         sales = float(input('Enter the sales for day #' + \
                             str(count) + ': '))
         sales_file.write(str(sales) + '\n')
         sales_file.close()
         print('Data written to sales.txt.')

main()
4

3 に答える 3

7

forループ内でファイルを閉じています。次回、ファイルに書き込むときにループを通過すると、閉じられたファイルに書き込もうとしているため、というエラーメッセージが表示されますI/O operation on closed file.

行を移動する

sales_file.close()

for ループの一番下にある print ステートメントの後にしますが、. のレベルでインデントしますforこれにより、ループの後で (繰り返しではなく) 1 回だけファイルが閉じられます。つまり、プログラムの最後で処理が終了したときです。

このような:

for count in range(1, num_days + 1):
   sales = float(input('Enter the sales for day #' + str(count) + ': '))
   sales_file.write(str(sales) + '\n')
   print('Data written to sales.txt.')

sales_file.close()   # close file once when done

より良いアプローチは、with完了時にファイルを自動的に閉じるステートメントを使用することです。だからあなたは言うことができます

with open('sales.txt', 'w') as sales_file:
   for count in range(1, num_days + 1)
      # rest of the code
      # but *no* close statement needed.
于 2012-05-14T01:53:07.580 に答える
1

with open('sales_file','w') ブロックを離れるwithと自動的にファイルが閉じられるように使用した場合は、これをよりクリーンな方法で行うことができます。したがって、次のように関数を編集します。

def main():

    num_days = int(input('For how many days do ' + \
                        'you have sales? '))

    with open('sales.txt', 'w') as sales_file:
        for count in range(1, num_days + 1):
            sales = float(input('Enter the sales for day #' + \
                                str(count) + ': '))
            sales_file.write(str(sales) + '\n')
            print('Data written to sales.txt.')
    # once you leave the block (here) it automatically closes sales_file
main()
于 2012-05-14T02:00:17.253 に答える
0

1 ループでファイルを閉じてから、次の繰り返しでファイルに書き込みます。ループの外側に閉じる

def main():

     num_days = int(input('For how many days do ' + \
                          'you have sales? '))

     sales_file = open('sales.txt', 'w')


     for count in range(1, num_days + 1):
         sales = float(input('Enter the sales for day #' + \
                             str(count) + ': '))
         sales_file.write(str(sales) + '\n')
         print('Data written to sales.txt.')

     sales_file.close()

main()

さらに良いことに、使用できますwith

def main():

     num_days = int(input('For how many days do you have sales? '))

     with open('sales.txt', 'w') as sales_file:

         for count in range(1, num_days + 1):
             sales = input('Enter the sales for day #%s: ' % count)
             sales_file.write('%s\n' % sales)
             print('Data written to sales.txt.')

main()
于 2012-05-14T01:53:46.773 に答える