197 votes

Comment lire les N premières lignes d'un fichier ?

Nous disposons d'un grand fichier de données brutes que nous souhaitons réduire à une taille donnée.

Comment obtenir les N premières lignes d'un fichier texte en python ? Est-ce que le système d'exploitation utilisé aura un effet sur la mise en oeuvre ?

0 votes

Puis-je donner n comme argument de ligne de commande ?

5voto

FatihAkici Points 1420

Les deux façons les plus intuitives de procéder sont les suivantes :

  1. Interroger le fichier ligne par ligne, et break après N lignes.

  2. Interroger le fichier ligne par ligne à l'aide de la fonction next() méthode N fois. (Il s'agit essentiellement d'une syntaxe différente pour ce que fait la réponse du haut).

Voici le code :

# Method 1:
with open("fileName", "r") as f:
    counter = 0
    for line in f:
        print line
        counter += 1
        if counter == N: break

# Method 2:
with open("fileName", "r") as f:
    for i in xrange(N):
        line = f.next()
        print line

En fin de compte, tant que vous n'utilisez pas de readlines() o enumerate Si vous ne voulez pas que tout le fichier soit en mémoire, vous avez de nombreuses options.

4voto

fdb Points 719

D'après la réponse la plus votée de gnibbler (Nov 20 '09 at 0:27) : cette classe ajoute les méthodes head() et tail() à l'objet fichier.

class File(file):
    def head(self, lines_2find=1):
        self.seek(0)                            #Rewind file
        return [self.next() for x in xrange(lines_2find)]

    def tail(self, lines_2find=1):  
        self.seek(0, 2)                         #go to end of file
        bytes_in_file = self.tell()             
        lines_found, total_bytes_scanned = 0, 0
        while (lines_2find+1 > lines_found and
               bytes_in_file > total_bytes_scanned): 
            byte_block = min(1024, bytes_in_file-total_bytes_scanned)
            self.seek(-(byte_block+total_bytes_scanned), 2)
            total_bytes_scanned += byte_block
            lines_found += self.read(1024).count('\n')
        self.seek(-total_bytes_scanned, 2)
        line_list = list(self.readlines())
        return line_list[-lines_2find:]

Utilisation :

f = File('path/to/file', 'r')
f.head(3)
f.tail(3)

3voto

Maxim Plaksin Points 11

De la manière la plus convaincante par mes propres moyens :

LINE_COUNT = 3
print [s for (i, s) in enumerate(open('test.txt')) if i < LINE_COUNT]

Solution basée sur Compréhension des listes La fonction open() supporte une interface d'itération. La fonction enumerate() couvre open() et renvoie des tuples (index, item), puis nous vérifions que nous sommes à l'intérieur d'une plage acceptée (if i < LINE_COUNT) et nous imprimons simplement le résultat.

Profitez du Python ;)

3voto

Surya Points 4152

Pour les 5 premières lignes, il suffit de faire :

N=5
with open("data_file", "r") as file:
    for i in range(N):
       print file.next()

2voto

John Machin Points 39706

Si vous voulez quelque chose qui, de toute évidence (sans avoir à chercher des trucs ésotériques dans les manuels), fonctionne sans importations et sans try/except et qui fonctionne sur un bon nombre de versions de Python 2.x (2.2 à 2.6) :

def headn(file_name, n):
    """Like *x head -N command"""
    result = []
    nlines = 0
    assert n >= 1
    for line in open(file_name):
        result.append(line)
        nlines += 1
        if nlines >= n:
            break
    return result

if __name__ == "__main__":
    import sys
    rval = headn(sys.argv[1], int(sys.argv[2]))
    print rval
    print len(rval)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X