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.