it-swarm.com.de

Lesen Sie die ersten N Zeilen einer Datei in python

Wir haben eine große Rohdatendatei, die wir auf eine bestimmte Größe zuschneiden möchten. Ich bin in .net c # erfahren, möchte dies jedoch in python) tun, um die Dinge zu vereinfachen und aus Interesse.

Wie würde ich vorgehen, um die ersten N Zeilen einer Textdatei in Python abzurufen? Wird das verwendete Betriebssystem Auswirkungen auf die Implementierung haben?

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)

Hier ist ein anderer Weg (beide 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

Wenn Sie die ersten Zeilen schnell lesen möchten und sich nicht für die Leistung interessieren, können Sie .readlines() verwenden, das ein Listenobjekt zurückgibt und dann die Liste schneidet.

Z.B. für die ersten 5 Zeilen:

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

Hinweis: Die gesamte Datei wird gelesen, so wie aus Sicht der Leistung nicht die beste aber es ist einfach zu bedienen, schnell zu schreiben und leicht zu merken, wenn Sie möchten Eine einmalige Berechnung ist sehr praktisch

print firstNlines
14
G M

Ich rufe die N Zeilen mit pandas auf. Ich denke, die Leistung ist nicht die beste, aber zum Beispiel, wenn N=1000:

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

Es gibt keine bestimmte Methode zum Lesen der Anzahl der Zeilen, die vom Dateiobjekt verfügbar gemacht werden.

Ich denke, der einfachste Weg wäre:

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

Die zwei intuitivsten Möglichkeiten, dies zu tun, wären:

  1. Durchlaufen Sie die Datei zeilenweise und break nach N Zeilen.

  2. Durchlaufen Sie die Datei zeilenweise mit der next() -Methode N. (Dies ist im Wesentlichen nur eine andere Syntax für das, was die Top-Antwort tut.)

Hier ist der 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

Die Quintessenz ist, dass Sie viele Optionen haben, solange Sie nicht readlines() oder enumerate verwenden, um die gesamte Datei in den Speicher zu laden.

4
FatihAkici

Basierend auf der von Gnibbler am besten bewerteten Antwort (20.11.09 um 0:27 Uhr): Diese Klasse fügt dem Dateiobjekt die Methode head () und tail () hinzu.

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

Verwendung:

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

am bequemsten alleine:

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

Lösung basierend auf List Comprehension Die Funktion open () unterstützt eine Iterationsschnittstelle. Das enumerate () deckt open () und return tuples (index, item) ab, dann prüfen wir, ob wir innerhalb eines akzeptierten Bereichs sind (wenn i <LINE_COUNT) und drucken dann einfach das Ergebnis.

Viel Spaß mit der Python. ;)

3
Maxim Plaksin

Wenn Sie eine wirklich große Datei haben und davon ausgehen, dass die Ausgabe ein numpy-Array sein soll, friert np.genfromtxt Ihren Computer ein. Das ist meiner Erfahrung nach so viel besser:

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

Wenn Sie etwas wollen, das offensichtlich (ohne esoterische Inhalte in Handbüchern nachzuschlagen) ohne Importe funktioniert, probieren Sie/except aus und bearbeiten Sie eine ganze Reihe von Python= 2.x-Versionen (2.2 bis 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

Ab Python 2.6 können Sie komplexere Funktionen in der IO base-Klasse nutzen. Die oben angegebene bestbewertete Antwort kann also wie folgt umgeschrieben werden:

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

(Sie müssen sich keine Sorgen machen, dass Ihre Datei weniger als N Zeilen enthält, da keine StopIteration-Ausnahme ausgelöst wird.)

2
Steve Bading

Für die ersten 5 Zeilen machen Sie einfach:

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

Diese Methode hat bei mir funktioniert

1
Mansur Ali

Das hat bei mir funktioniert

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