Чтение первых N строк файла в python

У нас есть большой файл необработанных данных, который мы хотели бы обрезать до указанного размера. У меня есть опыт работы с .net С#, однако я хотел бы сделать это на python, чтобы упростить вещи и из интереса.

Как бы я получить первые N строк текстового файла в Python? Повлияет ли используемая ОС на реализацию?

Ответ 1

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)

Здесь другой способ (оба Python 2 и 3)

from itertools import islice
with open("datafile") as myfile:
    head = list(islice(myfile, N))
print head

Ответ 2

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()

Ответ 3

Если вы хотите быстро прочитать первые строки и вам не нужна производительность, вы можете использовать .readlines(), который возвращает объект списка, а затем нарезает список.

например. для первых 5 строк:

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

Примечание. весь файл читается, поэтому не лучший из точки зрения производительности, но он прост в использовании, быстро записывается и легко запоминается, поэтому, если вы хотите просто выполнить некоторый разовый расчет очень удобен

print firstNlines

Ответ 4

То, что я делаю, это называть N строк, используя pandas. Я думаю, что производительность не самая лучшая, но, например, если N=1000:

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

Ответ 5

Нет специального метода для чтения количества строк, открытых файлом.

Я думаю, что самый простой способ:

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

Ответ 6

Основываясь на голосовом ответе gnibbler top (ноябрь 20, 2009 в 0:27): этот класс добавляет метод head() и tail() к файлу объекта.

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

Использование:

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

Ответ 7

Два наиболее интуитивных способа сделать это:

  1. Перебирайте файл построчно и break после N строк.

  2. Перебирайте файл построчно, используя метод next() N раз. (По сути, это просто другой синтаксис того, что делает верхний ответ.)

Вот код:

# 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

Суть в том, что если вы не используете readlines() и не enumerate весь файл в память, у вас есть много вариантов.

Ответ 8

наиболее удобный способ:

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

Решение, основанное на List Comprehension Функция open() поддерживает итерационный интерфейс. Элемент перечисления() охватывает open() и возвращает кортежи (индекс, элемент), затем мы проверяем, что мы находимся внутри принятого диапазона (если я < LINE_COUNT), а затем просто печатаем результат.

Наслаждайтесь Python.;)

Ответ 9

Если вы хотите что-то, что явно (без поиска эзотерического материала в руководствах) работает без импорта и пытается/исключается и работает на справедливом диапазоне версий 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)

Ответ 10

Начиная с Python 2.6, вы можете использовать более сложные функции в базовой класте IO. Поэтому вышеприведенный ответ можно переписать следующим образом:

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

(Вам не нужно беспокоиться о том, что ваш файл имеет меньше, чем N строк, так как не исключено исключение StopIteration.)

Ответ 11

Если у вас действительно большой файл, и если вы хотите, чтобы выход был массивом numpy, использование np.genfromtxt заморозит ваш компьютер. Это намного лучше в моем опыте:

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

Ответ 12

Для первых 5 строк просто выполните:

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

Ответ 13

#!/usr/bin/python

import subprocess

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

output, err = p.communicate()

print  output

Этот метод работал у меня

Ответ 14

Это сработало для меня

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