Es gibt verschiedene Snippets im Web, mit denen Sie die lesbare Größe von der Bytegröße zurückgeben können:
>>> human_readable(2048)
'2 kilobytes'
>>>
Aber gibt es eine Python-Bibliothek, die dies bietet?
python
code-snippets
filesize
Sridhar Ratnakumar
quelle
quelle
Antworten:
Behebung des oben genannten Problems "Eine zu kleine Aufgabe, um eine Bibliothek zu benötigen" durch eine einfache Implementierung:
Unterstützt:
Beispiel:
von Fred Cirera
quelle
B
(dh für andere Einheiten als Bytes) möchten Sie, dass der Faktor1000.0
eher als1024.0
nein ist?1
Zeilen 4 und 6 auf die gewünschte Genauigkeit.Eine Bibliothek mit allen Funktionen, nach denen Sie suchen, ist
humanize
.humanize.naturalsize()
scheint alles zu tun, was Sie suchen.quelle
humanize.naturalsize(2048) # => '2.0 kB'
,humanize.naturalsize(2048, binary=True) # => '2.0 KiB'
humanize.naturalsize(2048, gnu=True) # => '2.0K'
Hier ist meine Version. Es wird keine for-Schleife verwendet. Es hat eine konstante Komplexität, O ( 1 ), und ist theoretisch effizienter als die Antworten hier, die eine for-Schleife verwenden.
Um klarer zu machen, was los ist, können wir den Code für die Zeichenfolgenformatierung weglassen. Hier sind die Zeilen, die die Arbeit tatsächlich erledigen:
quelle
1000
würde also als anzeigen1,000 bytes
.unit_list = list(zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2]))
Die folgenden Arbeiten in Python 3.6+ sind meiner Meinung nach die am einfachsten zu verstehende Antwort hier und ermöglichen es Ihnen, die Anzahl der verwendeten Dezimalstellen anzupassen.
quelle
Obwohl ich weiß, dass diese Frage uralt ist, habe ich kürzlich eine Version entwickelt, die Schleifen vermeidet und
log2
die Größenreihenfolge bestimmt, die gleichzeitig als Verschiebung und Index in die Suffixliste dient:Könnte aber wegen seiner Lesbarkeit als unpythonisch angesehen werden :)
quelle
size
oder(1 << (order * 10)
infloat()
die letzte Zeile einschließen (für Python 2).import math
oben vielleicht etwas .Es muss immer einen dieser Typen geben. Nun, heute bin ich es. Hier ist eine einzeilige Lösung - oder zwei Zeilen, wenn Sie die Funktionssignatur zählen.
quelle
units=None
stattdessen verwenden)Wenn Sie Django installiert verwenden, können Sie auch das Dateigrößenformat ausprobieren :
quelle
Eine solche Bibliothek ist hurry.filesize .
quelle
Die Verwendung von Potenzen von 1000 oder Kibibyte wäre standardfreundlicher:
PS Vertraue niemals einer Bibliothek, die Tausende mit dem Suffix K (Großbuchstaben) druckt :)
quelle
P.S. Never trust a library that prints thousands with the K (uppercase) suffix :)
Warum nicht? Der Code könnte perfekt klingen und der Autor hat das Gehäuse für Kilo einfach nicht in Betracht gezogen. Es scheint ziemlich dumm zu sein, jeden Code basierend auf Ihrer Regel automatisch zu verwerfen ...Dies wird in fast jeder Situation das tun, was Sie brauchen, ist mit optionalen Argumenten anpassbar und, wie Sie sehen können, ziemlich selbstdokumentierend:
Beispielausgabe:
Erweiterte Anpassungen:
Dieser Code ist sowohl mit Python 2 als auch mit Python 3 kompatibel. Die Einhaltung von PEP8 ist eine Übung für den Leser. Denken Sie daran, es ist die Ausgabe , die hübsch ist.
Aktualisieren:
Wenn Sie Tausende Kommas benötigen, wenden Sie einfach die offensichtliche Erweiterung an:
Beispielsweise:
quelle
Sie sollten "humanisieren" verwenden.
quelle
Beim Riffing des als Alternative zu hurry.filesize () bereitgestellten Snippets handelt es sich um ein Snippet, das je nach verwendetem Präfix unterschiedliche Genauigkeitszahlen liefert. Es ist nicht so knapp wie einige Schnipsel, aber ich mag die Ergebnisse.
quelle
Das HumanFriendly-Projekt hilft dabei .
Der obige Code gibt 1 KB als Antwort.
Beispiele finden Sie hier .
quelle
Ausgehend von allen vorherigen Antworten, hier ist meine Sicht darauf. Es ist ein Objekt, das die Dateigröße in Bytes als Ganzzahl speichert. Wenn Sie jedoch versuchen, das Objekt zu drucken, erhalten Sie automatisch eine lesbare Version.
quelle
Ich mag die feste Genauigkeit der Absender-Dezimalversion , daher hier eine Art Hybrid davon mit der obigen Antwort von joctee (wussten Sie, dass Sie Protokolle mit nicht ganzzahligen Basen erstellen können?):
quelle
DiveIntoPython3 auch spricht auch über diese Funktion.
quelle
Moderne Django haben Selbstvorlagen-Tag
filesizeformat
:Formatiert den Wert wie a
human-readable
Dateigröße (z. B. '13 KB ',' 4.1 MB ',' 102 Bytes 'usw.).Beispielsweise:
Wenn der Wert 123456789 ist, würde die Ausgabe 117,7 MB betragen.
Weitere Informationen: https://docs.djangoproject.com/de/1.10/ref/templates/builtins/#filesizeformat
quelle
Wie wäre es mit einem einfachen 2-Liner:
So funktioniert es unter der Haube:
Kb
, daher sollte die Antwort X KiB sein)file_size/value_of_closest_unit
zusammen mit dem Gerät.Es funktioniert jedoch nicht, wenn die Dateigröße 0 oder negativ ist (da das Protokoll für 0- und -ve-Zahlen undefiniert ist). Sie können zusätzliche Schecks für sie hinzufügen:
Beispiele:
HINWEIS - Es gibt einen Unterschied zwischen Kb und KiB. KB bedeutet 1000 Bytes, während KiB 1024 Bytes bedeutet. KB, MB, GB sind alle Vielfache von 1000, während KiB, MiB, GiB usw. alle Vielfache von 1024 sind. Mehr dazu hier
quelle
quelle
Was Sie unten finden werden, ist keineswegs die leistungsstärkste oder kürzeste Lösung unter den bereits veröffentlichten. Stattdessen konzentriert es sich auf ein bestimmtes Thema , das viele der anderen Antworten übersehen.
Nämlich der Fall, wenn Eingabe wie
999_995
gegeben wird:was auf die nächste ganze Zahl gekürzt und wieder auf die Eingabe angewendet wird, ergibt
Dies scheint genau das zu sein, was wir erwarten würden, bis wir die Ausgabegenauigkeit steuern müssen . Und dann wird es etwas schwieriger.
Mit der auf 2 Stellen eingestellten Genauigkeit erhalten wir:
statt
1M
.Wie können wir dem entgegenwirken?
Natürlich können wir dies explizit überprüfen:
Aber können wir es besser machen? Können wir wissen, in welche Richtung das
order
geschnitten werden soll, bevor wir den letzten Schritt machen?Es stellt sich heraus, dass wir es können.
Unter der Annahme einer Rundungsregel von 0,5 Dezimalstellen bedeutet die obige
if
Bedingung:ergebend
geben
quelle
Sridhar Ratnakumar
Antwort von refer , aktualisiert auf:und Beispielausgabe ist:
quelle
Diese Lösung könnte Sie auch ansprechen, je nachdem, wie Ihr Verstand funktioniert:
quelle