Leer el archivo de la línea 2 u omitir la fila del encabezado


242

¿Cómo puedo omitir la fila del encabezado y comenzar a leer un archivo de la línea 2?

Respuestas:


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

51
si necesita el encabezado más tarde, en lugar de next(f)usarlo f.readline()y almacenarlo como una variable
condenado el

36
O usar header_line = next(f).
Samuel

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

Esto saltará 1 línea. ['a', 'b', 'c'][1:]=>['b', 'c']
Eric Duminil

3
@LjubisaLivac tiene razón: esta respuesta se generaliza a cualquier línea, por lo que esta es una solución mucho más poderosa.
Daniel Soutar

17
Esto está bien HASTA que el archivo sea demasiado grande para leer. Esto está bien para archivos pequeños.
CppLearner

1
El segmento también crea una copia de los contenidos. Esto es innecesariamente ineficiente.
chepner

¿Qué pasa con el uso consume()de more-itertoolscomo se indica en docs.python.org/3/library/itertools.html#itertools-recipes ? Escuché sobre esto en stackoverflow.com/questions/11113803
AnotherParker

24

Si desea la primera línea y luego desea realizar alguna operación en el archivo, este código será útil.

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

No es necesario asignar readline () a una variable si no se necesita esta línea. Sin embargo, me gusta más esta solución.
Anna

No se recomienda mezclar lecturas directas con el uso del archivo como iterador (aunque en este caso específico no se hace daño).
chepner

9

Si el corte podría funcionar en iteradores ...

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

1
Esta es una forma realmente agradable y pitónica de resolver el problema y puede extenderse a un número arbitrario de líneas de encabezado
Dai

Esta es una muy buena ejecución!
Diesel

Maravillosa solución
Russ Hyde

Esto debería ser votado mucho, mucho más de lo que es actualmente.
chepner

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

2
Esto leerá todo el archivo en la memoria a la vez, por lo que solo es práctico si está leyendo un archivo bastante pequeño.
Hayden Schiff

1

Para generalizar la tarea de leer varias líneas de encabezado y mejorar la legibilidad, usaría el método de extracción. Supongamos que desea tokenizar las tres primeras líneas decoordinates.txt para usar como información de encabezado.

Ejemplo

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

Luego, la extracción del método le permite especificar qué desea hacer con la información del encabezado (en este ejemplo simplemente tokenizamos las líneas del encabezado en función de la coma y la devolvemos como una lista, pero hay espacio para hacer mucho más).

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

Salida

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

Si coordinates.txtcontiene otro encabezado, simplemente cambie numberheaderlines. Lo mejor de todo es que está claro lo que __readheader(rh, numberheaderlines=2)está haciendo y evitamos la ambigüedad de tener que averiguar o comentar por qué el autor de la respuesta aceptada utiliza next()en su código.


1

Si desea leer varios archivos CSV a partir de la línea 2, esto funciona de maravilla

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

(Esto es parte de la respuesta de Parfait a una pregunta 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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.