Прочитайте файл із другого рядка або пропустіть рядок заголовка


242

Як я можу пропустити рядок заголовка і почати читати файл із рядка2?

Відповіді:


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

51
якщо вам потрібен заголовок пізніше, замість того, щоб next(f)використовувати f.readline()та зберігати його як змінну
проклятий

36
Або використовувати header_line = next(f).
Самуїл

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

Це пропустить 1 рядок. ['a', 'b', 'c'][1:]=>['b', 'c']
Ерік Думініл

3
@LjubisaLivac має рацію - ця відповідь узагальнює будь-який рядок, тому це набагато більш потужне рішення.
Даніель Сутар

17
Це добре, доки файл занадто великий для читання. Це добре для невеликих файлів.
CppLearner

1
З фрагмента також створюється копія вмісту. Це просто зайво неефективно.
чепнер

Що про використання consume()від , 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

Не потрібно присвоювати змінну readline () змінній, якщо їй цей рядок не потрібен. Однак мені найбільше подобається це рішення.
Анна

Змішування прямих читання з використанням файлу як ітератора не рекомендується (хоча в цьому конкретному випадку шкоди не завдається).
чепнер

9

Якщо нарізка може працювати на ітераторах ...

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

1
Це дійсно приємний і пітонічний спосіб вирішення проблеми, і його можна поширити на довільну кількість рядків заголовків
Дай

Це справді приємне виконання!
Дизель

Дивовижне рішення
Russ Hyde

На це слід звернути увагу набагато більше, ніж зараз.
чепнер

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, починаючи з другого рядка, це працює як принадність

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.