1

私は2つの入力を持つスクリプトを書いています:

  1. 名前のリストを含むファイル、
  2. 別のファイル (空または空でない可能性があります)

スクリプトの目的は、最初のファイルから名前を取得し、特定の API にアクセスして各名前に関する情報を取得し、その情報を 2 番目のファイルに書き込むことです。2 番目のファイルに既に情報が含まれている場合、スクリプトは書き込まれたファイルの最後の行を読み取り、最初のファイルでそのエントリを見つけて、そのエントリから開始します。ただし、2番目のファイルの読み取りと書き込みに関しては、問題が発生しています。

2 番目のファイル タイプを「r+」に設定し、file_two.read() で出力すると、2 番目のファイルの内容が表示されます。次の行で別の印刷を行うと、ファイルが空として表示されます。同様に、ファイル タイプを「a+」に設定すると、テキスト ファイル内の情報が実際にそこにあることがはっきりとわかりますが、ファイルは両方とも完全に空として表示されます。何が起こっているか知っている人はいますか?

書き込みを処理するコード セグメントは次のとおりです。

def write_to_file(filename, users):
    pages = range(0, len(users) - 100, 100)
    for page in pages:
        user_names = get_users(users[page: page+100])
        lines = [format_user(user) for user in user_names]
        output_text = '\n'.join(lines)
        with filename as output_file:
            output_file.write(output_text.encode('utf-8'))

上記の関数を呼び出すコード セグメントは次のとおりです。

file_one = args.file1
file_two = args.file2
users = read_names_automatic(file_one)
write_to_file(file_two, users)
4

1 に答える 1

3

2 番目のファイル タイプを「r+」に設定し、file_two.read() で出力すると、2 番目のファイルの内容が表示されます。次の行で別の印刷を行うと、ファイルが空として表示されます。

はい、これは予期された動作です。ファイル ポインタは の最後にあるファイルの最後を指しているfile_two.read()ため、さらに読み込もうとすると空の文字列が返されます。たとえば、次のことを確認してください。

with open("test.txt") as f:
    print f.readline() # => prints the first line, sets file pointer to second line
    print f.read() # => prints everything from the second line on

ファイルポインタをファイルの先頭にリセットするには:

with open("test.txt") as f:
    print f.read() # => prints entire file, sets file pointer to end of file
    f.seek(0) # => reset file pointer to beginning of file
    print f.read() # => prints entire file

同様に、ファイル タイプを「a+」に設定すると、テキスト ファイル内の情報が実際にそこにあることを明確に確認できますが、ファイルは両方とも完全に空として表示されます。

の場合open("test.txt", "a+")、ファイル ポインタはファイルの末尾に設定されるため、読み取りを試みると空の文字列が返されます。実際、これはファイルに追加できるものです。file_two.seek(0)するとfile_two.write()、書かれたテキストが の先頭に追加されますfile_two

于 2012-05-11T18:58:16.380 に答える