Hay varios fragmentos en la web que le darían una función para devolver el tamaño legible por humanos del tamaño de bytes:
>>> human_readable(2048)
'2 kilobytes'
>>>
Pero, ¿hay una biblioteca de Python que proporcione esto?
python
code-snippets
filesize
Sridhar Ratnakumar
fuente
fuente
Respuestas:
Abordar el problema anterior "una tarea demasiado pequeña para requerir una biblioteca" mediante una implementación sencilla:
Apoya:
Ejemplo:
por Fred Cirera
fuente
B
(es decir, para unidades que no sean bytes), ¿desearía que el factor sea1000.0
más que1024.0
no?1
líneas 4 y 6 a la precisión que desee.Una biblioteca que tiene toda la funcionalidad que parece que estás buscando es
humanize
.humanize.naturalsize()
parece hacer todo lo que estás buscando.fuente
humanize.naturalsize(2048) # => '2.0 kB'
,humanize.naturalsize(2048, binary=True) # => '2.0 KiB'
humanize.naturalsize(2048, gnu=True) # => '2.0K'
Aquí está mi versión. No usa un bucle for. Tiene una complejidad constante, O ( 1 ), y en teoría es más eficiente que las respuestas aquí que usan un bucle for.
Para que quede más claro lo que está sucediendo, podemos omitir el código para el formato de cadena. Aquí están las líneas que realmente hacen el trabajo:
fuente
1000
lo que se mostrará como1,000 bytes
.unit_list = list(zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2]))
Lo siguiente funciona en Python 3.6+, es, en mi opinión, la respuesta más fácil de entender aquí, y le permite personalizar la cantidad de lugares decimales utilizados.
fuente
Si bien sé que esta pregunta es antigua, recientemente se me ocurrió una versión que evita los bucles y la uso
log2
para determinar el orden de tamaño que funciona como un cambio y un índice en la lista de sufijos:Sin embargo, podría considerarse poco propónico por su legibilidad :)
fuente
size
o(1 << (order * 10)
enfloat()
la última línea (para python 2).import math
allá arriba.Siempre tiene que haber uno de esos tipos. Pues hoy soy yo. Aquí hay una solución de una línea, o dos líneas si cuenta la firma de la función.
fuente
units=None
lugar)Si está utilizando Django instalado, también puede probar el formato de archivo :
fuente
Una de esas bibliotecas es date prisa .
fuente
Usar potencias de 1000 o kibibytes sería más amigable con los estándares:
PD: Nunca confíes en una biblioteca que imprima miles con el sufijo K (mayúscula) :)
fuente
P.S. Never trust a library that prints thousands with the K (uppercase) suffix :)
Por qué no? El código podría ser perfectamente sólido y el autor simplemente no consideró la carcasa por kilo. Parece bastante tonto descartar automáticamente cualquier código basado en su regla ...Esto hará lo que necesita en casi cualquier situación, es personalizable con argumentos opcionales y, como puede ver, es bastante más auto-documentado:
Salida de ejemplo:
Personalizaciones avanzadas:
Este código es compatible con Python 2 y Python 3. El cumplimiento de PEP8 es un ejercicio para el lector. Recuerda, es el salida lo que es bonito.
Actualizar:
Si necesita miles de comas, simplemente aplique la extensión obvia:
Por ejemplo:
fuente
Deberías usar "humanizar".
fuente
Riffing en el fragmento proporcionado como una alternativa a hurry.filesize (), aquí hay un fragmento que proporciona números de precisión variables en función del prefijo utilizado. No es tan conciso como algunos fragmentos, pero me gustan los resultados.
fuente
El proyecto HumanFriendly ayuda con esto .
El código anterior le dará 1 KB como respuesta.
Los ejemplos se pueden encontrar aquí .
fuente
A partir de todas las respuestas anteriores, aquí está mi opinión al respecto. Es un objeto que almacenará el tamaño del archivo en bytes como un entero. Pero cuando intenta imprimir el objeto, obtiene automáticamente una versión legible para humanos.
fuente
Me gusta la precisión fija de la versión decimal de senderle , así que aquí hay una especie de híbrido de eso con la respuesta de joctee anterior (¿sabías que podrías tomar registros con bases no enteras?):
fuente
DiveIntoPython3 también habla sobre esta función.
fuente
Django moderno tiene una etiqueta de plantilla propia
filesizeformat
:Formatea el valor como un
human-readable
tamaño de archivo (es decir, '13 KB ',' 4.1 MB ',' 102 bytes ', etc.).Por ejemplo:
Si el valor es 123456789, la salida sería 117.7 MB.
Más información: https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#filesizeformat
fuente
¿Qué tal un simple 2 liner:
Así es como funciona debajo del capó:
Kb
, por lo que la respuesta debería ser X KiB)file_size/value_of_closest_unit
junto con la unidad.Sin embargo, no funciona si el tamaño del archivo es 0 o negativo (porque el registro no está definido para los números 0 y -ve). Puede agregar controles adicionales para ellos:
Ejemplos:
NOTA - Hay una diferencia entre Kb y KiB. KB significa 1000 bytes, mientras que KiB significa 1024 bytes. KB, MB, GB son múltiplos de 1000, mientras que KiB, MiB, GiB, etc. son múltiplos de 1024. Más información aquí.
fuente
fuente
Lo que está a punto de encontrar a continuación no es, de ninguna manera, la solución más eficiente o más corta entre las que ya se publicaron. En cambio, se enfoca en un tema particular que muchas de las otras respuestas pierden.
A saber, el caso cuando
999_995
se da una entrada como :que, al truncarse al entero más cercano y aplicarse nuevamente a la entrada, da
Esto parece ser exactamente lo que esperaríamos hasta que se nos requiera controlar la precisión de salida . Y aquí es cuando las cosas comienzan a ponerse un poco difíciles.
Con la precisión establecida en 2 dígitos obtenemos:
en lugar de
1M
.¿Cómo podemos contrarrestar eso?
Por supuesto, podemos verificarlo explícitamente:
¿Pero podemos hacerlo mejor? ¿Podemos saber de qué manera
order
debe cortar antes de dar el paso final?Resulta que podemos.
Suponiendo una regla de redondeo decimal de 0.5, la
if
condición anterior se traduce en:Resultando en
dando
fuente
Sridhar Ratnakumar
respuesta de referido , actualizada a:y el resultado de ejemplo es:
fuente
Esta solución también puede atraerlo, dependiendo de cómo funcione su mente:
fuente