2 Stimmen

Python schreibt nicht alle Einträge aus der Liste

Ich erforsche gerade Python und habe versucht, alle Dateien eines Verzeichnisses nach der letzten Änderung zu sortieren und die Liste dann in eine txt-Datei zu schreiben.

    import time
    import os
    i=1
    a="path"
    def getfiles(dirpat):
        b = [s for s in os.listdir(dirpat)
             if os.path.isfile(os.path.join(dirpat, s))]
        b.sort(key=lambda s: os.path.getmtime(os.path.join(dirpat, s)))
        return b
    lyst=[]
    testfile='c://test.txt'
    lyst=getfiles(a)
    for x in range (0,len(lyst)):
        print lyst[x]    
        fileHandle = open (testfile, 'w' )    
        fileHandle.write ("\n".join(str(lyst[x])))
        fileHandle.close()

Es wurde perfekt gedruckt und auch nach Datum sortiert

    example1.pdf
    example3.docx
    example4.docx
    exmaple2.docx
    example 5.doc

Aber als ich die Datei öffnete, war nur der letzte Eintrag vorhanden und wurde wie folgt angezeigt

    e
    x
    a
    ... and so on

Ich kann nur nicht herausfinden, wo das Problem liegt. Wenn ich "" entferne \n ".join gibt er nur den letzten Eintrag aus.

Vielen Dank im Voraus, Nils

4voto

Zaur Nasibov Punkte 21570

Korrigieren Sie die join() z.B:

'\n'.join(str(path) for path in list)

Und benennen Sie bitte die Variable "list" um, denn list ist ein eingebauter Datentyp in Python.

3voto

agf Punkte 159286
import os, os.path

a="path"

def getfiles(dirpat):
    b = [s for s in os.listdir(dirpat)
         if os.path.isfile(os.path.join(dirpat, s))]
    b.sort(key=lambda s: os.path.getmtime(os.path.join(dirpat, s)))
    return b

outfile='c://test.txt'

with open(outfile, 'w') as fileHandle:
    lines = getfiles(a)
    for line in lines:
        print line
        fileHandle.write(line)

Vermeiden Sie die Verwendung von bedeutungslosen einstelligen Variablennamen. Auch Ihre Funktion getfiles() habe ich nicht angefasst. Ich habe jedoch umbenannt file et list da dies die Namen von eingebauten Funktionen sind, die Sie bei der Verwendung dieser Namen verbergen.

Außerdem müssen Sie die Datei nur einmal öffnen, nicht einmal pro Zeile. Sie haben die Datei bei jedem Schreibvorgang abgeschnitten. Verwendung von with stellt sicher, dass das Dateihandle geschlossen wird, auch wenn ein Fehler auftritt.

Bearbeiten: Wenn Sie nicht jede Zeile ausdrucken müssen, bevor Sie sie schreiben, können Sie nur eine Zeile innerhalb der with Block: fileHandle.writelines(getfiles(a)) .

2voto

Sheik Yerbouti Punkte 1034

Tun Sie dies beim Schreiben der Datei:

fileHandle = open (file, 'w' )  
for listItem in list:
    print listItem    
    fileHandle.write (str(listItem) + "\n")
fileHandle.close()

2voto

matt b Punkte 135206

Sie öffnen und überschreiben den Inhalt der Datei in jeder Iteration der Schleife.

Übergeben Sie 'a' an den open(path) Aufruf, um an die Datei anzuhängen, oder öffnen Sie sie einfach einmal außerhalb der Schleife und schließen Sie sie außerhalb der Schleife.

2voto

ineX Punkte 98

Da Sie jeden Eintrag in der Liste in str die Verknüpfung wirkt auf jede str weil sie auch als Iterabilien zählen und daher eine \n wird zwischen zwischen die einzelnen Zeichen gesetzt, nicht zwischen jeden Eintrag in der Liste. Ändern Sie die Zeile in fileHandle.write ('\n'.join(str(path) for path in list))) wird dies beheben, wie BasicWolf schrieb.

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