J'utilise les flux de sortie du module IO et écrivez aux fichiers. Je veux pouvoir détecter lorsque j'ai écrit 1 g de données dans un fichier, puis commencez à écrire dans un deuxième fichier. Je ne peux pas sembler comprendre comment déterminer la quantité de données que j'ai écrite dans le fichier. P>
Y a-t-il quelque chose de facile intégré à io code>? Ou pourriez-je devoir compter les octets avant chaque écriture manuellement? P>
6 Réponses :
Voir la méthode Tell () sur l'objet Stream. P>
Je recommande de compter. Il n'y a pas de compteur de langue interne que je suis au courant. Quelqu'un d'autre a mentionné à l'aide de dell () code>, mais un compteur interne prendra à peu près la même quantité de travail et éliminera les appels constants du système d'exploitation. #pseudocode
if (written + sizeOfNew > 1G) {
rotateFile()
}
Sauf que si vous êtes judicieux avec dell () code> et permettez une marge d'erreur, c'est beaucoup moins de frais généraux que de compter.
Je ne peux pas imaginer comment cela pourrait être moins aérien. Ajout à un entier et le comparant à une valeur maximale est à la fois des opérations à instruction unique, ou de près de celui-ci si votre type est un peu important. dire () va descendre un arbre d'appel système. En outre, chaque fois que vous dites (), vous vérifiez quelque chose qui a déjà été écrit. Vous pouvez coder pour cela sans trop de problèmes, mais ...
Voir la documentation Python pour Objets de fichier , spécifiquement Exemple: P> >>> f=open('test.txt','w')
>>> f.write(10*'a')
>>> f.tell()
10L
>>> f.write(100*'a')
>>> f.tell()
110L
Si vous utilisez ce fichier pour un objectif de journalisation, je suggère d'utiliser le RotationFileHandler dans le module de journalisation Comme ceci: import logging
import logging.handlers
file_name = 'test.log'
test_logger = logging.getLogger('Test')
handler = logging.handlers.RotatingFileHandler(file_name, maxBytes=10**9)
test_logger.addHandler(handler)
Les informations sur la logrotate sont utiles pour comprendre cette approche: debian-administration.org/articles/1174
Besoin d'ajouter ceci: importer la journalisation.HandLers code>
Une approche assez simple consiste à sous-classer la classe code> de fichier code> et à garder une trace de la quantité de sortie qui est écrite dans le fichier. Vous trouverez ci-dessous un exemple de code montrant comment cela pourrait être fait qui semble principalement fonctionner.
Je dis principalement parce que la taille des fichiers produits est parfois légèrement sur le maximum, tout en le testant, mais c'est que le fichier test a été ouvert en mode "texte" et sous Windows, cela signifie que tous les Selon exactement ce que vous faites, la question de taille peut ne pas être un gros problème - cependant, pour de grandes tailles maximales, elle pourrait être de manière significative. Si quelqu'un a une bonne fixation indépendante de la plate-forme, par tous les moyens, laissez-nous savoir. P> \ N ' Code> Les caractères LineFeed sont convertis en ' \ r \ n ' code> (retour-à-coups, paires de linefeed) qui jette l'accumulateur de taille éteint. En outre, comme actuellement écrit, l'argument code> bufsize code> que le fichier standard () code> et ouvrir () code> Les fonctions Accepter n'est pas prise en charge, donc la valeur par défaut du système La taille et le mode seront toujours utilisés. P>
J'ai remarqué une ambiguïté dans votre question. Voulez-vous que le fichier soit (a) sur (b) sous (c) exactement 1GIB grand, avant de changer? P>
Il est facile de dire si vous êtes passé. Vérification si vous êtes sous 1GiB, mais passera sur 1GIB lors de votre prochaines écriture, est une technique similaire. La chose la plus difficile à faire est d'obtenir le fichier exactement 1GiB. Vous aurez besoin de Peu importe exactement quelle sémantique que vous souhaitez, Au fait, j'ai remarqué une direction définitive dans vos dernières questions. Êtes-vous au courant des chaînes #Twisted et #Python IRC sur freenode (irc.freenode.net)? Vous obtiendrez des réponses plus utiles et plus utiles. P>
~ c. p> dire () code> est suffisant pour ce genre de chose; Vérifiez simplement si dites ()> 1024 * 1024 * 1024: code> et vous saurez. P>
si len (data_to_write) + dit> 1024 * 1024 * 1024: code> suffira. P>
dell () code> la longueur du fichier, puis partitionner vos données de manière appropriée afin de toucher la marque précisément. P>
dell () code> va toujours être au moins aussi lent que le comptage vous-même et éventuellement plus lent. Cela ne signifie pas que c'est la mauvaise chose à faire; Si vous écrivez le fichier à partir d'un thread, vous voudrez presque certainement dire () code> plutôt que d'espoir que vous avez correctement préempté les autres threads écrivant dans le même fichier. (Et faites vos serrures, etc., mais c'est une autre question.) P>