Ada berbagai cuplikan di web yang akan memberi Anda fungsi untuk mengembalikan ukuran yang dapat dibaca manusia dari ukuran byte:
>>> human_readable(2048)
'2 kilobytes'
>>>
Tetapi apakah ada perpustakaan Python yang menyediakan ini?
python
code-snippets
filesize
Sridhar Ratnakumar
sumber
sumber
Jawaban:
Mengatasi masalah "tugas yang terlalu kecil untuk memerlukan pustaka" di atas dengan implementasi langsung:
Mendukung:
Contoh:
oleh Fred Cirera
sumber
B
(yaitu untuk unit selain byte) Anda ingin faktor menjadi1000.0
daripada1024.0
bukan?1
garis on 4 dan 6 ke ketepatan yang Anda inginkan.Perpustakaan yang memiliki semua fungsi yang tampaknya Anda cari adalah
humanize
.humanize.naturalsize()
tampaknya melakukan semua yang Anda cari.sumber
humanize.naturalsize(2048) # => '2.0 kB'
,humanize.naturalsize(2048, binary=True) # => '2.0 KiB'
humanize.naturalsize(2048, gnu=True) # => '2.0K'
Ini versiku. Itu tidak menggunakan for-loop. Ini memiliki kompleksitas konstan, O ( 1 ), dan secara teori lebih efisien daripada jawaban di sini yang menggunakan for-loop.
Untuk membuatnya lebih jelas apa yang sedang terjadi, kita dapat menghilangkan kode untuk pemformatan string. Berikut adalah baris yang benar-benar melakukan pekerjaan:
sumber
1000
akan ditampilkan sebagai1,000 bytes
.unit_list = list(zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2]))
Karya-karya berikut di Python 3.6+, adalah, menurut pendapat saya, jawaban termudah untuk dipahami di sini, dan memungkinkan Anda menyesuaikan jumlah tempat desimal yang digunakan.
sumber
Meskipun saya tahu pertanyaan ini kuno, saya baru-baru ini membuat versi yang menghindari loop, gunakan
log2
untuk menentukan urutan ukuran yang berfungsi ganda sebagai pergeseran dan indeks ke dalam daftar akhiran:Bisa juga dianggap unpythonic karena mudah dibaca, :)
sumber
size
atau(1 << (order * 10)
difloat()
dalam baris terakhir (untuk python 2).import math
di sana.Pasti selalu ada salah satu dari mereka. Baiklah hari ini saya. Inilah solusi satu-liner - atau dua baris jika Anda menghitung tanda tangan fungsi.
sumber
units=None
sebagai gantinya menggunakan )Jika Anda menggunakan Django terinstal, Anda juga dapat mencoba format filesize :
sumber
Salah satu perpustakaan semacam itu adalah rush.filesize .
sumber
Menggunakan kekuatan 1000 atau kibibytes akan lebih ramah-standar:
PS Jangan pernah percaya perpustakaan yang mencetak ribuan dengan akhiran K (huruf besar) :)
sumber
P.S. Never trust a library that prints thousands with the K (uppercase) suffix :)
Kenapa tidak? Kode dapat terdengar sempurna dan penulis tidak mempertimbangkan casing untuk kilo. Tampaknya cukup bodoh untuk secara otomatis mengabaikan kode apa pun berdasarkan aturan Anda ...Ini akan melakukan apa yang Anda butuhkan di hampir semua situasi, dapat disesuaikan dengan argumen opsional, dan seperti yang Anda lihat, cukup banyak mendokumentasikan diri:
Contoh output:
Kustomisasi lanjutan:
Kode ini kompatibel dengan Python 2 dan Python 3. Kepatuhan PEP8 adalah latihan untuk pembaca. Ingat, outputnya cantik.
Memperbarui:
Jika Anda membutuhkan ribuan koma, cukup terapkan ekstensi yang jelas:
Sebagai contoh:
sumber
Anda harus menggunakan "memanusiakan".
sumber
Riffing pada snippet yang disediakan sebagai alternatif untuk terburu-buru.filesize (), di sini adalah snippet yang memberikan angka presisi yang bervariasi berdasarkan awalan yang digunakan. Tidak sesempit beberapa cuplikan, tapi saya suka hasilnya.
sumber
Proyek HumanFriendly membantu dalam hal ini .
Kode di atas akan memberikan 1KB sebagai jawaban.
Contohnya dapat ditemukan di sini .
sumber
Menarik dari semua jawaban sebelumnya, inilah pendapat saya. Ini adalah objek yang akan menyimpan ukuran file dalam byte sebagai integer. Tetapi ketika Anda mencoba untuk mencetak objek, Anda secara otomatis mendapatkan versi yang dapat dibaca manusia.
sumber
Saya suka ketepatan tetap dari versi desimal pengirim , jadi inilah semacam hibrida dari itu dengan jawaban joctee di atas (apakah Anda tahu Anda dapat mengambil log dengan basis non-integer?):
sumber
DiveIntoPython3 juga berbicara tentang fungsi ini.
sumber
Django modern memiliki tag templat mandiri
filesizeformat
:Memformat nilai seperti a
human-readable
ukuran file (yaitu '13 KB ',' 4,1 MB ',' 102 byte ', dll.).Sebagai contoh:
Jika nilainya 123456789, output akan menjadi 117,7 MB.
Info lebih lanjut: https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#filesizeformat
sumber
Bagaimana dengan 2 liner sederhana:
Inilah cara kerjanya di bawah tenda:
Kb
, jadi jawabannya harus X KiB)file_size/value_of_closest_unit
bersama dengan unit.Namun itu tidak berfungsi jika ukuran file adalah 0 atau negatif (karena log tidak terdefinisi untuk angka 0 dan -ve). Anda dapat menambahkan cek tambahan untuk mereka:
Contoh:
CATATAN - Ada perbedaan antara Kb dan KiB. KB berarti 1000 byte, sedangkan KiB berarti 1024 byte. KB, MB, GB semuanya kelipatan 1000, sedangkan KiB, MiB, GiB dll semua kelipatan 1024. Lebih lanjut tentang hal ini di sini
sumber
sumber
Apa yang akan Anda temukan di bawah ini bukanlah solusi yang paling berkinerja atau terpendek di antara yang sudah diposting. Alih-alih, ini berfokus pada satu masalah tertentu yang tidak dijawab oleh banyak jawaban lainnya.
Yaitu kasus ketika input suka
999_995
diberikan:yang, terpotong ke bilangan bulat terdekat dan diterapkan kembali ke input yang diberikan
Ini tampaknya persis seperti yang kita harapkan sampai kita diharuskan mengendalikan presisi keluaran . Dan saat inilah segalanya mulai menjadi sedikit sulit.
Dengan presisi yang diatur ke 2 digit, kita dapat:
bukannya
1M
.Bagaimana kita bisa mengatasinya?
Tentu saja, kita dapat memeriksanya secara eksplisit:
Tetapi bisakah kita melakukan yang lebih baik? Bisakah kita mengetahui jalan mana yang
order
harus dipotong sebelum kita melakukan langkah terakhir?Ternyata kita bisa.
Dengan asumsi 0,5 aturan pembulatan desimal,
if
kondisi di atas diterjemahkan menjadi:yang menghasilkan
memberi
sumber
rujuk
Sridhar Ratnakumar
jawaban, diperbarui ke:dan contoh outputnya adalah:
sumber
Solusi ini mungkin juga menarik bagi Anda, tergantung pada bagaimana pikiran Anda bekerja:
sumber