Pythonic способ игнорировать переменную управления контуром

Программа Python, которую я пишу, - это прочитать заданное количество строк из верхней части файла, и программе необходимо сохранить этот заголовок для будущего использования. В настоящее время я делаю что-то похожее на следующее:

header = ''
header_len = 4
for i in range(1, header_len):
    header += file_handle.readline()

Пилинт жалуется, что я не использую переменную i. Что было бы более питоническим способом сделать это?

Изменить: Цель программы - разумно разбить исходный файл на более мелкие файлы, каждый из которых содержит исходный заголовок и подмножество данных. Итак, мне нужно прочитать и сохранить только заголовок, прежде чем читать остальную часть файла.

Ответ 1

f = open('fname')
header = [next(f) for _ in range(header_len)]

Поскольку вы собираетесь писать заголовок обратно в новые файлы, вам не нужно ничего с ним делать. Чтобы записать его в новый файл:

open('new', 'w').writelines(header + list_of_lines)

если вы знаете количество строк в старом файле, list_of_lines станет:

list_of_lines = [next(f) for _ in range(chunk_len)]

Ответ 2

Я не уверен, что такое правила Pylint, но вы можете использовать имя переменной "_" throwaway.

header = ''
header_len = 4
for _ in range(1, header_len):
    header += file_handle.readline()

Ответ 3

import itertools

header_lines = list(itertools.islice(file_handle, header_len))
# or
header = "".join(itertools.islice(file_handle, header_len))

Обратите внимание, что при первом символе новой строки все еще будут присутствовать, чтобы разделить их:

header_lines = list(n.rstrip("\n")
                    for n in itertools.islice(file_handle, header_len))

Ответ 4

Мой лучший ответ таков:

файл test.dat:

This is line 1
This is line 2
This is line 3
This is line 4
This is line 5
This is line 6
This is line 7
This is line 8
This is line 9

Python script:

f = open('test.dat')
nlines = 4
header = "".join(f.readline() for _ in range(nlines))

Вывод:

>>> header
'This is line 1\nThis is line 2\nThis is line 3\nThis is line 4\n'

Обратите внимание, что вам не нужно вызывать какие-либо модули; также, что вместо _ вы можете использовать любую фиктивную переменную (она работает с i, или j, или ni, или что-то еще), но я рекомендую, чтобы вы этого не сделали (во избежание путаницы). Вы можете лишить символы новой строки (хотя я не рекомендую вам это делать - так вы можете различать строки) или делать все, что вы можете делать со строками в Python.

Обратите внимание, что я не предоставлял режим открытия файла, поэтому по умолчанию он имеет значение "только для чтения" - это не Pythonic; в Python "явный лучше, чем неявный". Наконец, хорошие люди закрывают свои файлы; в этом случае он автоматически (потому что заканчивается script), но лучше всего закрыть их, используя f.close().

Счастливое Pythoning.

Изменить. Как отметил Роджер Пат, квадратные скобки не нужны в понимании списка, тем самым уменьшая длину строки на два символа. Оригинальный script был отредактирован, чтобы отразить это.

Ответ 5

Может быть:

header_len = 4
header = open("file.txt").readlines()[:header_len]

Но это будет проблематично для длинных файлов.

Ответ 6

Я не вижу ничего плохого в вашем решении, возможно, просто замените я на _, мне также не нравится вызывать itertools везде, где будет работать более простое решение, это похоже на людей, использующих jQuery для тривиальных задач javascript. во всяком случае, просто для того, чтобы иметь месть здесь, это мое решение

так как вы хотите читать весь файл в любом случае по очереди, почему бы просто не прочитать первый заголовок и после этого сделать то, что вы хотите сделать

header = ''
header_len = 4

for i, line in enumerate(file_handle):
    if i < header_len:
        header += line
    else:
        # output chunks to separate files
        pass

print header

Ответ 7

Как насчет:

header = []
for i,l in enumerate(file_handle):
    if i <= 3: 
         header += l
         continue
    #proc rest of file here

Ответ 8

Одна проблема с использованием _ в качестве фиктивной переменной заключается в том, что она решает проблему только на одном уровне, рассмотрим что-то вроде следующего.

def f(n, m):
"""A function to run g() n times and run h() m times per g."""
    for _ in range(n):
        g()
        for _ in range(m):
            h()
    return 0

Эта функция работает нормально, но _ iterator over m run проблематична, так как она может конфликтовать с верхним _. В любом случае PyCharm жалуется на такой синтаксис.

Поэтому я бы сказал, что _ не является "выбросом", как было предложено ранее.

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

def run(f, n, *args):
    """Runs f with the arguments from the args tuple n times."""
    for _ in range(n):
        f(*args)

например. вы можете использовать его следующим образом:

>>> def ft(x, L):
...     L.append(x)

>>> a = 7
>>> nums = [4, 1]
>>> run(ft, 10, a, nums)
>>> nums
[4, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7]

Ответ 9

s=""
f=open("file")
for n,line in enumerate(f):
  if n<=3 : s=s+line
  else:
      # do something here to process the rest of the lines          
print s
f.close()