Warum keine len (Datei) in Python?

8

Ich bin Python nicht gerade neu, aber ich habe immer noch Schwierigkeiten zu verstehen, was etwas "Pythonic" (und das Gegenteil) macht.

Verzeiht mir, wenn das eine dumme Frage ist, aber warum kann ich nicht die Größe einer Datei durch eine Datei (len) erreichen?

file. __len__ ist nicht einmal implementiert, also ist es nicht so, dass es für etwas anderes benötigt wird? Wäre es aus irgendeinem Grund verwirrend / inkonsistent, wenn es implementiert wäre, um die Dateigröße zurückzugeben?

    
Dr. Kickass 31.05.2013, 20:23
quelle

6 Antworten

12
Die Datei

​​ist ein Iterator. Um die Anzahl der Zeilen zu finden müssen Sie die gesamte Datei lesen

%Vor%

Wenn Sie die Anzahl der Bytes in einer Datei haben möchten, verwenden Sie os.stat

zB

%Vor%     
John La Rooy 31.05.2013, 20:26
quelle
15

Dateien haben eine breitere Definition, besonders in Unix, als Sie vielleicht denken. Wie groß ist beispielsweise die Länge eines Druckers? Oder ein CD-ROM-Laufwerk? Beide sind Dateien in / dev und eine Art in Windows.

Für was wir normalerweise als eine Datei denken, was wäre ihre Länge? Die Größe der Variablen? Die Größe der Datei in Bytes? Letzteres macht mehr Sinn, aber dann wird es noch ekliger. Sollte die Größe des Dateiinhalts oder seine Größe auf der Festplatte aufgelistet sein (Modul-Zuordnungseinheitsgröße). Die Frage stellt sich erneut für Sparse-Dateien (Dateien, die große leere Abschnitte haben, die keinen Speicherplatz beanspruchen, aber Teil der normalerweise gemeldeten Dateigröße sind, unterstützt von einigen Dateisystemen wie NTFS und XFS).

Natürlich könnte die Antwort auf all diese Fragen lauten: "Wähle einfach eine aus und dokumentiere, was du ausgewählt hast." Vielleicht sollte genau das getan werden, aber um Pythonic zu sein, muss etwas in der Regel klar sein, ohne viele Dokumente lesen zu müssen. len(string) ist meistens offensichtlich (man kann fragen, ob Bytes oder Zeichen der Rückgabewert sind), len(array) ist offensichtlich, len(file) ist vielleicht nicht vollständig genug.

    
Charles Burns 31.05.2013 20:30
quelle
5
  

Also vergib mir, wenn das eine dumme Frage ist, aber warum kann ich das nicht bekommen?   Größe einer Datei durch Ausführen einer Datei (len)?

Charles Burns 'Antwort macht einen guten Eindruck von Unix' Philosophie "alles ist eine Datei", und obwohl Sie immer os.fstat() verwenden können, um die 'Größe' für jeden Dateideskriptor zu bekommen, mit etwas wie ...

%Vor%

... es kann nichts sinnvolles oder nützliches zurückgeben ...

%Vor%

Ich denke, der Grund dafür ist, dass ein Python-Dateiobjekt oder ein dateiähnliches Objekt einen Stream darstellen soll, und Streams haben inhärent keine Länge, besonders wenn sie schreibgeschützt sind, wie sys.stdout . .

Normalerweise ist das einzige, was Sie für ein Python-Datei-ähnliches Objekt garantieren können, dass es mindestens eines von read() oder write() unterstützt, und das ist es auch schon.

>     
Aya 31.05.2013 20:57
quelle
2

Ich würde sagen, da das Finden der Länge von der spezifischen Funktionalität des Betriebssystems abhängt. Sie können die Länge einer Datei mit diesem Code finden:

import os os.path.getsize('C:\file.txt')

Sie können auch die gesamte Datei in einer Zeichenfolge lesen und die Länge der Zeichenfolge ermitteln. Sie möchten jedoch sicher sein, dass die Datei keine große Größe hat, die Ihren gesamten Speicher verbraucht.

    
wardd 31.05.2013 20:27
quelle
2

file gibt einen Iterator zurück, so dass Sie len() nicht verwenden können.

Um die Größe einer Datei zu ermitteln, können Sie os.stat : %Vor%

Wenn Sie mit der Größe die Anzahl der Zeilen meinen, versuchen Sie Folgendes:

%Vor%

oder

sum (1 for _ in open("abc"))

    
Ashwini Chaudhary 31.05.2013 20:27
quelle
1

Ein einfacher Weg, die Anzahl der Zeichen zu messen, wäre:

%Vor%     
gepoch 31.05.2013 20:59
quelle

Tags und Links