Python In Datei speichern

77

Ich möchte eine Zeichenfolge in einer Datei mit einem Python-Programm namens speichern Failed.py

Folgendes habe ich bisher:

myFile = open('today','r')

ips = {}

for line in myFile:
    parts = line.split(' ')
    if parts[1] == 'Failure':
        if parts[0] in ips:
            ips[pars[0]] += 1
        else:
            ips[parts[0]] = 0

for ip in [k for k, v in ips.iteritems() if v >=5]:
    #write to file called Failed.py
Stefan
quelle
2
Aus purer Neugier: Gibt es eine Möglichkeit, eine Antwort in eine akzeptierte zu verwandeln? (Stefan scheint jahrelang inaktiv zu sein)
Wolf
Was ist das eigentliche Problem?
Marquis von Lorne

Antworten:

168
file = open('Failed.py', 'w')
file.write('whatever')
file.close()

Hier ist eine pythonischere Version, die die Datei automatisch schließt, selbst wenn es eine Ausnahme im umschlossenen Block gab:

with open('Failed.py', 'w') as file:
    file.write('whatever')
warvariuc
quelle
2
fileist kein geschütztes Wort in Python, es muss nicht verwendet werden file_, es sei denn, Ihr Codierungsstil-Guide erfordert das _Suffix für Variablen in dem Kontext (Datei, Funktion, Klasse, Methode), in dem dies stattfindet.
zstewart
6
Es geht nicht um Codierungsstil. fileist eingebaute Funktion wie viele andere . Es wird nicht empfohlen , diese integrierten Funktionen mit anderen Variablen zu beschatten.
Warvariuc
1
filewurde in Python 3 veraltet und entfernt, daher ist es vollkommen in Ordnung, es dort zu verwenden. Ich habe das 2.7-Tag auf der Frage nicht gesehen und benutze normalerweise Python 3 ...
zstewart
2
@ Anatoly Sie schließen die Datei nicht
warvariuc
3
@warvariuc danke, du hast recht, dann scheint dies keine bewährte Methode zu sein
Anatoly Vasilyev
20

Sie müssen die Datei erneut mit öffnen open(), diesmal jedoch, 'w'um anzuzeigen, dass Sie in die Datei schreiben möchten. Ich würde auch empfehlen, withum sicherzustellen, dass die Datei geschlossen wird, wenn Sie mit dem Schreiben fertig sind.

with open('Failed.txt', 'w') as f:
    for ip in [k for k, v in ips.iteritems() if v >=5]:
        f.write(ip)

Natürlich möchten Sie möglicherweise Zeilenumbrüche oder andere Formatierungen in Ihre Ausgabe aufnehmen, aber die Grundlagen sind wie oben.

Das gleiche Problem beim Schließen Ihrer Datei gilt für den Lesecode. Das sollte so aussehen:

ips = {}
with open('today','r') as myFile:
    for line in myFile:
        parts = line.split(' ')
        if parts[1] == 'Failure':
            if parts[0] in ips:
                ips[pars[0]] += 1
            else:
                ips[parts[0]] = 0
David Heffernan
quelle
2

Sie können diese Funktion verwenden:

def saveListToFile(listname, pathtosave):
    file1 = open(pathtosave,"w") 
    for i in listname:
        file1.writelines("{}\n".format(i))    
    file1.close() 

# to save:
saveListToFile(list, path)
ALSHARGI NEWYORK
quelle
1
myFile = open('today','r')

ips = {}

for line in myFile:
    parts = line.split()
    if parts[1] == 'Failure':
        ips.setdefault(parts[0], 0)
        ips[parts[0]] += 1

of = open('failed.py', 'w')
for ip in [k for k, v in ips.iteritems() if v >=5]:
    of.write(k+'\n')

Schauen Sie sich setdefault an, es macht den Code ein wenig lesbarer. Anschließend sichern Sie Ihre Daten mit der Schreibmethode des Dateiobjekts.

jaime
quelle
1
Genau das, was er gesagt hat. Fügen Sie dort am Ende ein of.close hinzu. Andernfalls wird davon ausgegangen, dass der GC die Datei schließt. Explizit ist besser als implizit. Vielen Dank.
Jaime
1
@jaime Wirklich müssen Sie mehr als nur anrufen close. Sie müssen dies in einem endgültigen Block tun, um sich gegen Ausnahmen zu verteidigen. Der idiomatische Weg ist die Verwendung eines withKontext-Handlers.
David Heffernan
1
Ja Danke. Das kam mir in den Sinn, aber ich machte mir Sorgen zu erklären, wann ich endlich angerufen werde. Nachdem ich Ihren Kommentar gelesen hatte, stellte ich fest, dass er die Frage python-2.7 markiert hatte. Vielen Dank.
Jaime