Frage an file, file-io, python – Lesen und Schreiben von Dateien in Python

1

Ich schreibe ein Skript mit zwei Eingaben:

eine Datei mit einer Liste von Namen,eine andere Datei (kann leer oder nicht leer sein)

Der Zweck des Skripts besteht darin, die Namen aus der ersten Datei zu übernehmen, auf eine bestimmte API zuzugreifen, Informationen zu jedem Namen abzurufen und diese Informationen in die zweite Datei zu schreiben. Wenn die zweite Datei bereits Informationen enthält, liest das Skript die letzte Zeile der geschriebenen Datei, sucht diesen Eintrag in der ersten Datei und beginnt dann mit diesem Eintrag. Ich habe jedoch Probleme beim Lesen und Schreiben der zweiten Datei.

Wenn ich den zweiten Dateityp auf "r +" setze und dann file_two.read () drucke, wird der Inhalt der zweiten Datei angezeigt. Wenn ich in der nächsten Zeile erneut drucke, wird die Datei als leer angezeigt. Wenn ich den Dateityp auf "a +" setze, wird die Datei beide Male als vollständig leer angezeigt, obwohl ich die Informationen in der Textdatei in der Tat deutlich sehen kann. Weiß jemand, was los ist?

Hier ist das Codesegment, das das Schreiben behandelt:

<code>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'))
</code>

Und hier ist das Codesegment, das die obige Funktion aufruft.

<code>file_one = args.file1
file_two = args.file2
users = read_names_automatic(file_one)
write_to_file(file_two, users)
</code>
Die Datei wurde bereits zuvor im Skript mit argparse geöffnet. Dieser Code schreibt einfach alle Informationen in die Datei und schließt die Datei, sobald sie fertig ist. user1389884
Istwith filename as output_file: ein Tippfehler? ich denke du meinstwith open(filename, 'a+') as output_file:. modocache

Deine Antwort

1   die antwort
3

Wenn ich den zweiten Dateityp auf "r +" setze und dann file_two.read () drucke, wird der Inhalt der zweiten Datei angezeigt. Wenn ich in der nächsten Zeile erneut drucke, wird die Datei als leer angezeigt.

Ja, das ist erwartetes Verhalten. Der Dateizeiger zeigt auf das Ende der Datei am Ende vonfile_two.read()Daher gibt jeder weitere Leseversuch eine leere Zeichenfolge zurück. Überprüfen Sie beispielsweise Folgendes:

<code>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
</code>

So setzen Sie den Dateizeiger auf den Anfang der Datei zurück:

<code>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
</code>

Wenn ich den Dateityp auf "a +" setze, wird die Datei beide Male als vollständig leer angezeigt, obwohl ich die Informationen in der Textdatei in der Tat deutlich sehen kann.

Wenn duopen("test.txt", "a+")Wenn der Dateizeiger auf das Ende der Datei gesetzt ist, führt jeder Leseversuch zu einer leeren Zeichenfolge. Dies ermöglicht es Ihnen in der Tatanhängen in die Datei. Wenn dufile_two.seek(0) und dannfile_two.write()wird der geschriebene Text am Anfang von hinzugefügtfile_two.

Verwandte Fragen