Ler arquivo da linha 2 ou pular linha do cabeçalho


242

Como posso pular a linha do cabeçalho e começar a ler um arquivo da linha2?

Respostas:


453
with open(fname) as f:
    next(f)
    for line in f:
        #do something

51
se você precisar do cabeçalho mais tarde, em vez de next(f)uso f.readline()e armazená-lo como uma variável
condenado

36
Ou use header_line = next(f).
Samuel

94
f = open(fname,'r')
lines = f.readlines()[1:]
f.close()

Isso pulará 1 linha. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil

3
@LjubisaLivac está certo - esta resposta generaliza para qualquer linha, portanto, essa é uma solução muito mais poderosa.
Daniel Soutar

17
Tudo bem, até que o arquivo seja muito grande para ser lido. Isso é bom para arquivos pequenos.
CppLearner

1
A fatia também cria uma cópia do conteúdo. Isso é desnecessariamente ineficiente.
chepner

Que tal usar consume()de more-itertoolscomo indicado na docs.python.org/3/library/itertools.html#itertools-recipes ? Eu ouvi sobre isso em stackoverflow.com/questions/11113803
AnotherParker

24

Se você deseja a primeira linha e deseja executar alguma operação no arquivo, este código será útil.

with open(filename , 'r') as f:
    first_line = f.readline()
    for line in f:
            # Perform some operations

Não é necessário atribuir readline () a uma variável se alguém não precisar dessa linha. Eu gosto mais desta solução, no entanto.
Anna

A mistura de leituras diretas com o uso do arquivo como um iterador não é recomendada (embora neste caso específico, nenhum dano seja causado).
chepner

9

Se o fatiamento pudesse funcionar em iteradores ...

from itertools import islice
with open(fname) as f:
    for line in islice(f, 1, None):
        pass

1
Esta é uma maneira muito agradável e pythônico de resolver o problema e pode ser estendido para um número arbitrário de linhas de cabeçalho
Dai

Esta é uma execução muito boa!
Diesel

Solução maravilhosa
Russ Hyde

Isso deve ser votado muito, muito mais do que é atualmente.
chepner

8
f = open(fname).readlines()
firstLine = f.pop(0) #removes the first line
for line in f:
    ...

2
Isso lerá o arquivo inteiro na memória de uma só vez; portanto, só é prático se você estiver lendo um arquivo bastante pequeno.
Hayden Schiff

1

Para generalizar a tarefa de ler várias linhas de cabeçalho e melhorar a legibilidade, eu usaria a extração de método. Suponha que você queira tokenizar as três primeiras linhas coordinates.txtpara usar como informações de cabeçalho.

Exemplo

coordinates.txt
---------------
Name,Longitude,Latitude,Elevation, Comments
String, Decimal Deg., Decimal Deg., Meters, String
Euler's Town,7.58857,47.559537,0, "Blah"
Faneuil Hall,-71.054773,42.360217,0
Yellowstone National Park,-110.588455,44.427963,0

A extração do método permite especificar o que você deseja fazer com as informações do cabeçalho (neste exemplo, simplesmente tokenizamos as linhas do cabeçalho com base na vírgula e a retornamos como uma lista, mas há espaço para fazer muito mais).

def __readheader(filehandle, numberheaderlines=1):
    """Reads the specified number of lines and returns the comma-delimited 
    strings on each line as a list"""
    for _ in range(numberheaderlines):
        yield map(str.strip, filehandle.readline().strip().split(','))

with open('coordinates.txt', 'r') as rh:
    # Single header line
    #print next(__readheader(rh))

    # Multiple header lines
    for headerline in __readheader(rh, numberheaderlines=2):
        print headerline  # Or do other stuff with headerline tokens

Resultado

['Name', 'Longitude', 'Latitude', 'Elevation', 'Comments']
['String', 'Decimal Deg.', 'Decimal Deg.', 'Meters', 'String']

Se coordinates.txtcontiver outro cabeçalho, basta alterar numberheaderlines. O melhor de tudo, é claro o que __readheader(rh, numberheaderlines=2)está fazendo e evitamos a ambiguidade de ter que descobrir ou comentar por que o autor da resposta aceita usa next()em seu código.


1

Se você deseja ler vários arquivos CSV a partir da linha 2, isso funciona como um encanto

for files in csv_file_list:
        with open(files, 'r') as r: 
            next(r)                  #skip headers             
            rr = csv.reader(r)
            for row in rr:
                #do something

(isso faz parte da resposta da Parfait a uma pergunta diferente)


0
# Open a connection to the file
with open('world_dev_ind.csv') as file:

    # Skip the column names
    file.readline()

    # Initialize an empty dictionary: counts_dict
    counts_dict = {}

    # Process only the first 1000 rows
    for j in range(0, 1000):

        # Split the current line into a list: line
        line = file.readline().split(',')

        # Get the value for the first column: first_col
        first_col = line[0]

        # If the column value is in the dict, increment its value
        if first_col in counts_dict.keys():
            counts_dict[first_col] += 1

        # Else, add to the dict and set value to 1
        else:
            counts_dict[first_col] = 1

# Print the resulting dictionary
print(counts_dict)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.