Question

Je pense que j'améliore constamment ma question précédente. Fondamentalement, j'aurais besoin de monter un grand fichier texte (CSV) pour envoyer des pièces à un multiprocesse.pool. Pour ce faire, je pense que j'ai besoin de l'objet iTable où les lignes peuvent être itérées. (voir Comment multiprocer les grands fichiers texte dans Python?)

Maintenant, j'ai réalisé que l'objet de fichier lui-même (ou un type _io.textiOWRapper) après avoir ouvert un fichier de texte est itérable ligne par ligne, alors peut-être que mon code de set sa longueur? Mais si c'est itable, pourquoi ne puis-je pas appeler sa longueur (par lignes, pas les octets)?

Merci!

def chunks(l,n):
    """Divide a list of nodes `l` in `n` chunks"""
    l_c = iter(l)
    while 1:
        x = tuple(itertools.islice(l_c,n))
        if not x:
            return
        yield x
Était-ce utile?

La solution

La raison pour laquelle les fichiers sont itérables, c'est qu'ils sont lus en série. La longueur d'un fichier, en ligne, ne peut être calculée que si le fichier est traité. (La longueur du fichier en octets n'est pas un indicateur du nombre de lignes qu'il dispose.)

Le problème est que, si le fichier était long des gigaoctets, vous ne voudrez peut-être pas le lire deux fois s'il pouvait être aidé.

C'est pourquoi il vaut mieux ne pas connaître la longueur; C'est pourquoi il faut traiter les fichiers de données en tant que Iterable plutôt qu'une collection / vecteur / tableau qui a une longueur.

Votre code de chasse devrait être en mesure de traiter directement avec l'objet de fichier lui-même, sans connaître sa longueur.

Cependant Si vous vouliez connaître le nombre de lignes avant le traitement pleinement, vos 2 options sont

  1. Tampon tout le fichier dans un tableau de lignes d'abord, puis transmettez ces lignes à votre Chunker
  2. Lisez-le deux fois, la première fois en jetant toutes les données, en enregistrant simplement les lignes
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top