4 Stimmen

Lesen von Zeilen aus einer Textdatei in Python (Windows)

Ich arbeite an einer einfachen Importroutine, die eine Textdatei in ein json-Dateiformat für unser System in Python übersetzt.

import json

# Open text file for reading
txtFile = open('Boating.Make.txt', 'r')

# Create picklist obj
picklistObj = dict()
picklistObj\['name'\] = 'Boating.Make'
picklistObj\['items'\] = list()

i = 0
# Iterate through each make in text file
for line in txtFile:
    picklistItemObj = dict()
    picklistItemObj\['value'\] = str(i)
    picklistItemObj\['text'\] = line.strip()
    picklistItemObj\['selectable'\] = True
    picklistObj\['items'\].append(picklistItemObj)
    i = i + 1
txtFile.close()

picklistJson = json.dumps(picklistObj, indent=4)
print picklistJson

picklistFile = open('Boating.Make.json', 'w')
picklistFile.write(picklistJson)
picklistFile.close()

Meine Frage ist, warum brauche ich den "Streifen"? Ich dachte, dass Python auf magische Weise die Zeilenumbruchkonstante für jede Umgebung, in der ich mich gerade befinde, kennen sollte. Bin ich etwas fehlt?

Ich sollte klarstellen, dass die Textdatei, aus der ich lese, eine ASCII-Datei ist, die Textzeilen enthält, die durch ' \r\n '.

3voto

Eser Aygün Punkte 7204

Python behält die Zeichen der neuen Zeile bei, während die Zeilen aufgezählt werden. Wenn zum Beispiel eine Textdatei wie die folgende aufgezählt wird

foo
bar

erhalten Sie zwei Saiten: "foo\n" et "bar\n" . Wenn Sie die Zeilenumbruchzeichen des Terminals nicht wünschen, rufen Sie strip() .

Ich bin übrigens kein Fan von diesem Verhalten.

1voto

Akash Punkte 281

Voir este .

Python wird normalerweise mit universellen Unterstützung für Zeilenumbrüche; die Eingabe von 'U' öffnet die Datei wie eine Textdatei, aber Zeilen können sein die Unix-Zeilenende-Konvention ' \n ', die Macintosh-Konvention ' \r ' Windows-Konvention ' \r\n '

0voto

John Gaines Jr. Punkte 10426

Sie brauchen strip(), weil "for line in file:" die Zeilenabschlüsse in den Zeilen belässt. Das steht nicht explizit in der Dokumentation (zumindest in der 2.71-Dokumentation, die ich mir ansehe). Aber es funktioniert ähnlich wie file.readline(), das ausdrücklich angibt, dass es den Zeilenumbruch beibehält.

0voto

Noctis Skytower Punkte 20111

Probieren Sie das Folgende in einem Python-Interpreter aus, um zu sehen, was die Sprache macht:

open('test1.txt', 'wb').write(b'Hello\nWorld!')
open('test2.txt', 'wb').write(b'Hello\r\nWorld!')
print(list(open('test1.txt'))) # Shows ['Hello\n', 'World!']
print(list(open('test2.txt'))) # Shows ['Hello\n', 'World!']

Python erkennt die richtigen Zeilenumbrüche. Statt der Verwendung von strip auf Ihre Strings zu schreiben, sollten Sie vielleicht myString.replace('\n', '') stattdessen. Prüfen Sie die Dokumentation:

>>> help(str.strip)
Help on method_descriptor:

strip(...)
    S.strip([chars]) -> str

    Return a copy of the string S with leading and trailing
    whitespace removed.
    If chars is given and not None, remove characters in chars instead.

>>> help(str.replace)
Help on method_descriptor:

replace(...)
    S.replace(old, new[, count]) -> str

    Return a copy of S with all occurrences of substring
    old replaced by new.  If the optional argument count is
    given, only the first count occurrences are replaced.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X