Читать файл из строки 2 или пропустить строку заголовка

242

Как я могу пропустить строку заголовка и начать чтение файла из строки 2?

super9
источник

Ответы:

454
with open(fname) as f:
    next(f)
    for line in f:
        #do something
SilentGhost
источник
52
если вам нужен заголовок позже, вместо next(f)использования f.readline()и сохранения его как переменной
проклятый
37
Или используйте header_line = next(f).
Самуил
94
f = open(fname,'r')
lines = f.readlines()[1:]
f.close()
chriscauley
источник
Это пропустит 1 строку. ['a', 'b', 'c'][1:]=>['b', 'c']
Эрик
3
@LjubisaLivac прав - этот ответ обобщает любую строку, так что это гораздо более мощное решение.
Даниэль Соутар
17
Это нормально, пока файл не слишком большой для чтения. Это хорошо для небольших файлов.
CppLearner
1
Срез также создает копию содержимого. Это просто излишне неэффективно.
chepner
Как насчет использования consume()from, more-itertoolsкак указано в docs.python.org/3/library/itertools.html#itertools-recipes ? Я слышал об этом на stackoverflow.com/questions/11113803
AnotherParker
24

Если вам нужна первая строка, а затем вы хотите выполнить некоторую операцию с файлом, этот код будет полезен.

with open(filename , 'r') as f:
    first_line = f.readline()
    for line in f:
            # Perform some operations
saimadhu.polamuri
источник
Нет необходимости назначать readline () переменной, если эта строка не нужна. Однако мне больше всего нравится это решение.
Анна
Смешивать прямое чтение с использованием файла в качестве итератора не рекомендуется (хотя в этом конкретном случае никакого вреда не будет).
chepner
9

Если нарезка может работать на итераторах ...

from itertools import islice
with open(fname) as f:
    for line in islice(f, 1, None):
        pass
Вайк Хермеч
источник
1
Это действительно хороший и питонный способ решения проблемы, который может быть расширен до произвольного числа строк заголовка
Dai
Это действительно хорошее исполнение!
Дизель
Чудесное решение
Расс Хайд
За это должно быть проголосовано гораздо больше, чем сейчас.
chepner
8
f = open(fname).readlines()
firstLine = f.pop(0) #removes the first line
for line in f:
    ...
Дрор Хилман
источник
2
Это приведет к одновременному считыванию всего файла в память, поэтому практично, если вы читаете довольно маленький файл.
Хайден Шифф
1

Чтобы обобщить задачу чтения нескольких строк заголовка и улучшить читабельность, я бы использовал метод извлечения. Предположим, вы хотите разметить первые три строкиcoordinates.txt для использования в качестве информации заголовка.

пример

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

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

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

Вывод

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

Если coordinates.txtсодержит другой заголовок, просто измените numberheaderlines. Лучше всего то, что понятно, что __readheader(rh, numberheaderlines=2)происходит, и мы избегаем двусмысленности необходимости выяснять или комментировать, почему автор принятого ответа использует next()в своем коде.

Минь Чан
источник
1

Если вы хотите прочитать несколько файлов CSV, начиная со строки 2, это работает как шарм

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

(это часть ответа Парфе на другой вопрос)

Тиаго Мартинс Перес 李大仁
источник
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)
Мауро Рементерия
источник