Il existe différents extraits sur le Web qui vous donneraient une fonction pour renvoyer la taille lisible par l'homme à partir de la taille des octets:
>>> human_readable(2048)
'2 kilobytes'
>>>
Mais existe-t-il une bibliothèque Python qui fournit cela?
python
code-snippets
filesize
Sridhar Ratnakumar
la source
la source
Réponses:
Résoudre le problème ci-dessus "d'une tâche trop petite pour nécessiter une bibliothèque" par une implémentation simple:
Les soutiens:
Exemple:
par Fred Cirera
la source
B
(c'est-à-dire pour les unités autres que les octets), vous voudriez que le facteur soit1000.0
plutôt que1024.0
non?1
lignes 4 et 6 par la précision souhaitée.Une bibliothèque qui a toutes les fonctionnalités que vous cherchez semble être
humanize
.humanize.naturalsize()
semble faire tout ce que vous cherchez.la source
humanize.naturalsize(2048) # => '2.0 kB'
,humanize.naturalsize(2048, binary=True) # => '2.0 KiB'
humanize.naturalsize(2048, gnu=True) # => '2.0K'
Voici ma version. Il n'utilise pas de boucle for. Il a une complexité constante, O ( 1 ), et est en théorie plus efficace que les réponses ici qui utilisent une boucle for.
Pour rendre plus clair ce qui se passe, nous pouvons omettre le code pour le formatage des chaînes. Voici les lignes qui font réellement le travail:
la source
1000
serait donc afficher comme1,000 bytes
.unit_list = list(zip(['bytes', 'kB', 'MB', 'GB', 'TB', 'PB'], [0, 0, 1, 2, 2, 2]))
Les travaux suivants dans Python 3.6+, sont, à mon avis, la réponse la plus facile à comprendre ici, et vous permettent de personnaliser la quantité de décimales utilisée.
la source
Bien que je sache que cette question est ancienne, j'ai récemment proposé une version qui évite les boucles, en utilisant
log2
pour déterminer l'ordre de taille qui se double d'un décalage et d'un index dans la liste des suffixes:Pourrait bien être considéré comme non pythonique pour sa lisibilité, cependant :)
la source
size
ou(1 << (order * 10)
dansfloat()
la dernière ligne (pour Python 2).import math
là-haut.Il doit toujours y avoir un de ces gars. Aujourd'hui, c'est moi. Voici une solution à une ligne - ou deux lignes si vous comptez la signature de la fonction.
la source
units=None
place)Si vous utilisez Django installé, vous pouvez également essayer le format de fichier :
la source
Une de ces bibliothèques est hurry.filesize .
la source
L'utilisation de puissances de 1000 ou de kibio serait plus conforme aux normes:
PS Ne faites jamais confiance à une bibliothèque qui imprime des milliers avec le suffixe K (majuscule) :)
la source
P.S. Never trust a library that prints thousands with the K (uppercase) suffix :)
Pourquoi pas? Le code pourrait être parfaitement sain et l'auteur n'a tout simplement pas considéré le boîtier pour kilo. Il semble assez idiot de rejeter automatiquement tout code basé sur votre règle ...Cela fera ce dont vous avez besoin dans presque toutes les situations, est personnalisable avec des arguments facultatifs et, comme vous pouvez le voir, est à peu près auto-documenté:
Exemple de sortie:
Personnalisations avancées:
Ce code est compatible avec Python 2 et Python 3. La conformité PEP8 est un exercice pour le lecteur. Rappelez-vous, c'est la sortie qui est jolie.
Mettre à jour:
Si vous avez besoin de milliers de virgules, appliquez simplement l'extension évidente:
Par exemple:
la source
Vous devez utiliser "humaniser".
la source
Sur la base de l'extrait fourni comme alternative à hurry.filesize (), voici un extrait qui donne des nombres de précision variables en fonction du préfixe utilisé. Ce n'est pas aussi concis que certains extraits, mais j'aime les résultats.
la source
Le projet HumanFriendly aide à ce .
Le code ci-dessus donnera 1 Ko comme réponse.
Des exemples peuvent être trouvés ici .
la source
À partir de toutes les réponses précédentes, voici mon point de vue. C'est un objet qui stockera la taille du fichier en octets sous forme d'entier. Mais lorsque vous essayez d'imprimer l'objet, vous obtenez automatiquement une version lisible par l'homme.
la source
J'aime la précision fixe de la version décimale de senderle , alors voici une sorte d'hybride avec la réponse de joctee ci-dessus (saviez-vous que vous pouviez prendre des journaux avec des bases non entières?):
la source
DiveIntoPython3 parle également de cette fonction.
la source
Django moderne a une balise auto-modèle
filesizeformat
:Formate la valeur comme une
human-readable
taille de fichier (c'est-à-dire «13 Ko», «4,1 Mo», «102 octets», etc.).Par exemple:
Si la valeur est 123456789, la sortie serait de 117,7 Mo.
Plus d'informations: https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#filesizeformat
la source
Que diriez-vous d'une simple doublure:
Voici comment cela fonctionne sous le capot:
Kb
, donc la réponse doit être X Kio)file_size/value_of_closest_unit
avec l'unité.Cependant, cela ne fonctionne pas si la taille du fichier est 0 ou négative (car le journal n'est pas défini pour les nombres 0 et -ve). Vous pouvez leur ajouter des chèques supplémentaires:
Exemples:
NOTE - Il y a une différence entre Kb et KiB. KB signifie 1000 octets, tandis que KiB signifie 1024 octets. KB, MB, GB sont tous des multiples de 1000, tandis que KiB, MiB, GiB etc. sont tous des multiples de 1024. Plus d'informations ici
la source
la source
Ce que vous êtes sur le point de trouver ci-dessous n'est en aucun cas la solution la plus performante ou la plus courte parmi celles déjà publiées. Au lieu de cela, il se concentre sur un problème particulier que la plupart des autres réponses manquent.
A savoir le cas où une entrée comme
999_995
est donnée:qui, étant tronqué à l'entier le plus proche et appliqué de nouveau à l'entrée, donne
Cela semble être exactement ce à quoi nous nous attendions jusqu'à ce que nous soyons tenus de contrôler la précision de la sortie . Et c'est là que les choses commencent à devenir un peu difficiles.
Avec une précision de 2 chiffres, nous obtenons:
au lieu de
1M
.Comment pouvons-nous contrer cela?
Bien sûr, nous pouvons le vérifier explicitement:
Mais pouvons-nous faire mieux? Pouvons-nous savoir de quelle façon les
order
coupes devraient être effectuées avant de faire la dernière étape?Il s'avère que nous le pouvons.
En supposant une règle d'arrondi de 0,5 décimal, la
if
condition ci-dessus se traduit par:résultant en
donnant
la source
référer
Sridhar Ratnakumar
la réponse, mise à jour pour:et un exemple de sortie est:
la source
Cette solution peut également vous intéresser, selon le fonctionnement de votre esprit:
la source