W sieci dostępne są różne fragmenty, które umożliwiłyby przywrócenie czytelnego dla człowieka rozmiaru z wielkości bajtów:
>>> human_readable(2048)
'2 kilobytes'
>>>
Ale czy istnieje biblioteka Python, która to zapewnia?
python
code-snippets
filesize
Sridhar Ratnakumar
źródło
źródło
Odpowiedzi:
Rozwiązanie powyższego problemu „zbyt małe zadanie, aby wymagać biblioteki” przez prostą implementację:
Obsługuje:
Przykład:
autor: Fred Cirera
źródło
B
(tj. dla jednostek innych niż bajty) chciałbyś, aby czynnik był1000.0
raczej niż1024.0
nie?1
wiersze 4 i 6 na dowolną dokładność.Jest to biblioteka, która ma wszystkie funkcje, których szukasz
humanize
.humanize.naturalsize()
wydaje się robić wszystko, czego szukasz.źródło
humanize.naturalsize(2048) # => '2.0 kB'
,humanize.naturalsize(2048, binary=True) # => '2.0 KiB'
humanize.naturalsize(2048, gnu=True) # => '2.0K'
Oto moja wersja. Nie używa pętli for. Ma stałą złożoność, O ( 1 ), i jest teoretycznie bardziej wydajny niż odpowiedzi tutaj, które używają pętli for.
Aby wyjaśnić, co się dzieje, możemy pominąć kod formatowania łańcucha. Oto linie, które faktycznie wykonują pracę:
źródło
1000
pokaże się jako1,000 bytes
.unit_list = list(zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2]))
Poniższe działa w Pythonie 3.6+, jest, moim zdaniem, najłatwiejszą do zrozumienia odpowiedzią tutaj i pozwala dostosować liczbę miejsc dziesiętnych.
źródło
Chociaż wiem, że to pytanie jest pradawne, niedawno opracowałem wersję, która pozwala uniknąć pętli, używając
log2
do określenia kolejności rozmiarów, która podwaja się jako przesunięcie i indeks do listy sufiksów:Można go jednak uznać za mało mityczny ze względu na jego czytelność :)
źródło
size
czy(1 << (order * 10)
wfloat()
w ostatnim wierszu (dla Pythona 2).import math
tam potrzebować .Zawsze musi być jeden z tych facetów. Cóż, dzisiaj to ja. Oto rozwiązanie jednowierszowe - lub dwie linie, jeśli policzymy podpis funkcji.
źródło
units=None
zamiast tego używa )Jeśli korzystasz z zainstalowanego Django, możesz także wypróbować format rozmiaru pliku :
źródło
Jedną z takich bibliotek jest pośpiech . Rozmiar pliku .
źródło
Użycie mocy 1000 lub kibibajtów byłoby bardziej przyjazne dla standardów:
PS Nigdy nie ufaj bibliotece, która drukuje tysiące z sufiksem K (wielkie litery) :)
źródło
P.S. Never trust a library that prints thousands with the K (uppercase) suffix :)
Dlaczego nie? Kod może być doskonale poprawny, a autor po prostu nie wziął pod uwagę obudowy na kilogram. Wydaje się, że automatyczne odrzucenie dowolnego kodu w oparciu o twoją regułę wydaje się niesłychanie ...To zrobi to, czego potrzebujesz w prawie każdej sytuacji, można ją dostosować za pomocą opcjonalnych argumentów i, jak widać, jest w zasadzie samodokumentujące:
Przykładowe dane wyjściowe:
Zaawansowane dostosowania:
Ten kod jest zgodny zarówno z Python 2, jak i Python 3. Zgodność z PEP8 jest ćwiczeniem dla czytelnika. Pamiętaj, że wynik jest ładny.
Aktualizacja:
Jeśli potrzebujesz tysięcy przecinków, po prostu zastosuj oczywiste rozszerzenie:
Na przykład:
źródło
Powinieneś użyć „humanizować”.
źródło
Riffing na fragmencie udostępnionym jako alternatywa dla hurry.filesize (), oto fragment, który daje różne liczby precyzji w zależności od użytego prefiksu. Nie jest tak zwięzły jak niektóre fragmenty, ale lubię wyniki.
źródło
Pomaga w tym projekt HumanFriendly .
Powyższy kod da 1 KB jako odpowiedź.
Przykłady można znaleźć tutaj .
źródło
Czerpiąc ze wszystkich poprzednich odpowiedzi, oto moje zdanie na ten temat. Jest to obiekt, który przechowa rozmiar pliku w bajtach jako liczbę całkowitą. Ale kiedy próbujesz wydrukować obiekt, automatycznie otrzymujesz wersję czytelną dla człowieka.
źródło
Podoba mi się stała precyzja wersji dziesiętnej senderle , więc oto rodzaj hybrydy z powyższą odpowiedzią Joctee (czy wiesz, że możesz wziąć dzienniki z bazami niecałkowitymi?):
źródło
DiveIntoPython3 mówi również o tej funkcji.
źródło
Nowoczesne Django mają własny szablon tagu
filesizeformat
:Formatuje wartość jak
human-readable
rozmiar pliku (tj. „13 KB”, „4.1 MB”, „102 bajty” itp.).Na przykład:
Jeśli wartość wynosi 123456789, wynik wyniósłby 117,7 MB.
Więcej informacji: https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#filesizeformat
źródło
Co powiesz na prosty 2 liniowiec:
Oto, jak to działa pod maską:
Kb
, więc odpowiedzią powinno być X KiB)file_size/value_of_closest_unit
wraz z jednostką.Nie działa jednak, jeśli rozmiar pliku wynosi 0 lub jest ujemny (ponieważ log jest niezdefiniowany dla liczb 0 i -ve). Możesz dodać dla nich dodatkowe kontrole:
Przykłady:
UWAGA - Istnieje różnica między Kb a KiB. KB oznacza 1000 bajtów, podczas gdy KiB oznacza 1024 bajty. KB, MB, GB są wielokrotnościami 1000, podczas gdy KiB, MiB, GiB itp. Są wielokrotnościami 1024. Więcej o tym tutaj
źródło
źródło
To, co zaraz znajdziesz, nie jest w żaden sposób najbardziej wydajnym ani najkrótszym rozwiązaniem spośród już opublikowanych. Zamiast tego skupia się na jednym konkretnym problemie , którego brakuje w wielu innych odpowiedziach.
Mianowicie przypadek, gdy podano dane wejściowe
999_995
:które, skrócone do najbliższej liczby całkowitej i zastosowane z powrotem do wejścia, daje
Wydaje się, że dokładnie tego oczekujemy, dopóki nie będziemy musieli kontrolować precyzji wyjściowej . I wtedy zaczyna się robić trochę trudniej.
Przy precyzji ustawionej na 2 cyfry otrzymujemy:
zamiast
1M
.Jak możemy temu przeciwdziałać?
Oczywiście możemy to wyraźnie sprawdzić:
Ale czy możemy zrobić lepiej? Czy możemy dowiedzieć się, w którą stronę
order
należy wyciąć, zanim zrobimy ostatni krok?Okazuje się, że możemy.
Przy założeniu reguły zaokrąglania dziesiętnego 0,5 powyższy
if
warunek przekłada się na:powodując
dający
źródło
odnieść się do
Sridhar Ratnakumar
odpowiedzi, zaktualizowano do:a przykładowy wynik to:
źródło
To rozwiązanie może ci się spodobać, w zależności od tego, jak działa twój umysł:
źródło