2017-11-13 10 views
1

コードは、私は、関数の外でコードを使用する場合、それは正常に動作し、ファイル内の行数を印刷しようとしている外部の機能を動作しますが、内部ではない機能(パイソン)

input_file_name = input("Please Enter the name of your text file: ") 
infile = open(input_file_name, "r") 

listOfLines = infile.readlines() 
count = 0 
char = " " 

for line in listOfLines : 
    text = line.rstrip() 
    while char != "": 
     char = infile.read(1) 
    count = count + 1 
print(count) 


infile.close() 

私は関数の中で同じコードを使用すると、5(私のテストファイルの長さ)の代わりに0の値を出力します。私は機能

def print_file(infile): 
listOfLines = infile.readlines() 
for line in listOfLines: 
    text = line.rstrip() 
    print(text) 

や関数の呼び出し、

print_file(infile) 

を削除する場合

def main(): 

    input_file_name = input("Please Enter the name of your text file: ") 
    infile = open(input_file_name, "r") 
    print() 

    print_file(infile) 
    count_lines(infile) 

    infile.close() 


def print_file(infile): 
    listOfLines = infile.readlines() 
    for line in listOfLines: 
     text = line.rstrip() 
     print(text) 

def count_lines(infile): 
    listOfLines = infile.readlines() 
    count = 0 
    char = " " 

    for line in listOfLines : 
     text = line.rstrip() 
     while char != "": 
      char = infile.read(1) 
     count = count + 1 
    print(count) 

main() 

しかし、それが正常に動作します。最初の機能が2番目の機能の印刷方法に影響するのはなぜですか?

+0

'print_file'がファイルを消費し、ストリームを最初に戻さないためです。 – MFisherKDX

+0

最初の関数はファイルをEOFに残すためです。だから次の関数は何も読んでいない。 count_lines()メソッドの先頭に 'infile.seek(0)'を追加して、ファイルをその開始位置にリセットしてみてください。 –

+1

[開いているファイルに対してread()を2回呼び出すことができないのはなぜですか?](https://stackoverflow.com/questions/3906137/why-cant-i-call-read-twice-on-an-オープンファイル) – MFisherKDX

答えて

2

infile = open(input_file_name, "r")を使用して作成するファイルオブジェクトはイテレータです。 1回だけループすることができます。

print_fileファンクションは、ファイルの最初の繰り返しを実行し、その内容を使い果たします。 count_linesで2回目の反復を試みると、反復子が終了したため、何も起こりません。

+0

ありがとう、私はこれを知らなかった! –

関連する問題