Pergunta

Temos um grande arquivo de dados brutos que gostaríamos de aparar para um tamanho especificado. Tenho experiência no .NET C#, no entanto, gostaria de fazer isso no Python para simplificar as coisas e fora de interesse.

Como eu conseguiria obter as primeiras n linhas de um arquivo de texto em Python? O sistema operacional será usado terá algum efeito na implementação?

Foi útil?

Solução

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)

Aqui está outra maneira (ambos Python 2 e 3)

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

Outras dicas

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

Se você quiser ler as primeiras linhas rapidamente e não se importa com o desempenho, você pode usar .readlines() que retorna o objeto da lista e depois corta a lista.

Por exemplo, para as 5 primeiras linhas:

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

Observação: Todo o arquivo é lido assim é não é o melhor do ponto de vista de desempenho Mas é fácil de usar, rápido de escrever e fácil de lembrar, por isso, se você quiser, apenas executar um cálculo único é muito conveniente

print firstNlines

O que eu faço é chamar as n linhas usando pandas. Eu acho que o desempenho não é o melhor, mas por exemplo se N=1000:

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

Não existe um método específico para ler o número de linhas expostas pelo objeto de arquivo.

Eu acho que a maneira mais fácil seria seguir:

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

Com base na resposta votada no top gnibbler (20 de novembro de 09 às 0:27): esta classe Add Head () e Tail () Método para arquivar objeto.

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

Uso:

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

As duas maneiras mais intuitivas de fazer isso seriam:

  1. Itera na linha de arquivo por linha e break depois N linhas.

  2. Itera no arquivo linha por linha usando o next() método N vezes. (Isso é essencialmente apenas uma sintaxe diferente para o que a resposta superior faz.)

Aqui está o código:

# 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

A linha inferior é, desde que você não use readlines() ou enumerateNo arquivo inteiro na memória, você tem muitas opções.

Caminho mais conveniente por conta própria:

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

Solução baseada em Compreensão da listaA função aberta () suporta uma interface de iteração. O enumerado () cobre o Open () e Return Tuples (índice, item), verificamos se estamos dentro de um intervalo aceito (se eu <line_count) e, em seguida, simplesmente imprimimos o resultado.

Aproveite o python. ;)

Se você deseja algo que obviamente (sem procurar coisas esotéricas em manuais) funciona sem importações e tente/exceto e funciona em uma gama justa de versões Python 2.x (2.2 a 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)

Começando no Python 2.6, você pode aproveitar funções mais sofisticadas no clase de base de IO. Portanto, a resposta mais bem classificada acima pode ser reescrita como:

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

(Você não precisa se preocupar com o seu arquivo ter menos de n linhas, pois nenhuma exceção de parada é lançada.)

Se você tem um arquivo realmente grande e assumindo que deseja que a saída seja uma matriz Numpy, o uso do np.genFromtxt congelará seu computador. Isso é muito melhor na minha experiência:

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

Para as 5 primeiras linhas, basta fazer:

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

import subprocess

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

output, err = p.communicate()

print  output

Este método funcionou para mim

Isso funcionou para mim

f = open("history_export.csv", "r")
line= 5
for x in range(line):
    a = f.readline()
    print(a)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top