web-dev-qa-db-fra.com

Lire les N premières lignes d'un fichier dans python

Nous avons un fichier de données brutes volumineux que nous aimerions couper à une taille spécifiée. Je suis expérimenté dans .net c #, cependant, je voudrais le faire dans python pour simplifier les choses et par intérêt.

Comment pourrais-je obtenir les N premières lignes d'un fichier texte en python? Le système d'exploitation utilisé aura-t-il un effet sur la mise en œuvre?

133
Russell

Python 2

with open("datafile") as myfile:
    head = [next(myfile) for x in xrange(N)]
print head

Python 3

with open("datafile") as myfile:
    head = [next(myfile) for x in range(N)]
print(head)

Voici un autre moyen (Python 2 & 3)

from itertools import islice
with open("datafile") as myfile:
    head = list(islice(myfile, N))
print head
215
John La Rooy
N = 10
file = open("file.txt", "a")#the a opens it in append mode
for i in range(N):
    line = file.next().strip()
    print line
file.close()
17
ghostdog74

Si vous voulez lire rapidement les premières lignes sans vous soucier des performances, vous pouvez utiliser .readlines(), qui retourne un objet de la liste, puis coupe la liste en tranches.

Par exemple. pour les 5 premières lignes:

with open("pathofmyfileandfileandname") as myfile:
    firstNlines=myfile.readlines()[0:5] #put here the interval you want

Note: tout le fichier est lu ainsi pas le meilleur du point de vue des performances mais il est facile à utiliser, rapide à écrire et facile à retenir, donc si vous voulez il suffit de faire un calcul ponctuel est très pratique

print firstNlines
14
G M

Ce que je fais est d'appeler les N lignes en utilisant pandas. Je pense que la performance n'est pas la meilleure, mais par exemple si N=1000:

import pandas as pd
yourfile = pd.read('path/to/your/file.csv',nrows=1000)
8
Cro-Magnon

Il n'y a pas de méthode spécifique pour lire le nombre de lignes exposées par l'objet fichier.

Je suppose que le moyen le plus simple serait de suivre:

lines =[]
with open(file_name) as f:
    lines.extend(f.readline() for i in xrange(N))
6
artdanil

Les deux manières les plus intuitives de le faire seraient:

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

  2. Parcourez le fichier ligne par ligne à l'aide de la méthode next() _ N fois. (Ceci est essentiellement juste une syntaxe différente pour ce que la réponse principale fait.)

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 bout de ligne, tant que vous n'utilisez pas readlines() ou enumerate tout le fichier en mémoire, vous disposez de nombreuses options.

4
FatihAkici

Basé sur gnibbler top voté réponse (20 novembre 09 à 0:27): cette classe ajoute les méthodes head () et tail () pour archiver un objet.

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:]

Usage:

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

manière la plus pratique par moi-même:

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

Solution basée sur List Compréhension La fonction open () supporte une interface d'itération. Enumerate () couvre open () et renvoie des nuplets (index, item), puis nous vérifions que nous nous trouvons dans une plage acceptée (si i <LINE_COUNT), puis nous imprimons simplement le résultat.

Profitez du Python. ;)

3
Maxim Plaksin

Si vous avez un très gros fichier et si vous voulez que la sortie soit un tableau numpy, l'utilisation de np.genfromtxt gèlera votre ordinateur. C'est tellement mieux dans mon expérience:

def load_big_file(fname,maxrows):
'''only works for well-formed text file of space-separated doubles'''

rows = []  # unknown number of lines, so use list

with open(fname) as f:
    j=0        
    for line in f:
        if j==maxrows:
            break
        else:
            line = [float(s) for s in line.split()]
            rows.append(np.array(line, dtype = np.double))
            j+=1
return np.vstack(rows)  # convert list of vectors to array
2
cacosomoza

Si vous voulez quelque chose qui fonctionne (sans regarder dans les manuels) sans importation ésotérique et essayez/except et fonctionne avec un nombre non négligeable de Python versions 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 __== "__main__":
    import sys
    rval = headn(sys.argv[1], int(sys.argv[2]))
    print rval
    print len(rval)
2
John Machin

À partir de Python 2.6, vous pouvez tirer parti des fonctions plus sophistiquées de la clase de base IO. Ainsi, la réponse la mieux notée ci-dessus peut être réécrite comme suit:

    with open("datafile") as myfile:
       head = myfile.readlines(N)
    print head

(Vous n'avez pas à vous soucier du fait que votre fichier compte moins de N lignes car aucune exception StopIteration n'est levée.)

2
Steve Bading

Pour les 5 premières lignes, faites simplement:

N=5
with open("data_file", "r") as file:
    for i in range(N):
       print file.next()
2
Surya
#!/usr/bin/python

import subprocess

p = subprocess.Popen(["tail", "-n 3", "passlist"], stdout=subprocess.PIPE)

output, err = p.communicate()

print  output

Cette méthode a fonctionné pour moi

1
Mansur Ali

Cela a fonctionné pour moi

f = open("history_export.csv", "r")
line= 5
for x in range(line):
    a = f.readline()
    print(a)
0
Sukanta