Pythonic忽略循环控制变量的方法

时间:2009-12-11 04:57:44

标签: python

我正在编写的Python程序是从文件顶部读取一定数量的行,程序需要保留此标题以备将来使用。目前,我正在做类似以下的事情:

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

Pylint抱怨我没有使用变量i。什么是更加pythonic的方式来做到这一点?

编辑:程序的目的是智能地将原始文件拆分为较小的文件,每个文件都包含原始标题和数据的子集。因此,在读取文件的其余部分之前,我需要读取并保留标题。

9 个答案:

答案 0 :(得分:11)

我不确定Pylint规则是什么,但你可以使用'_'一次性变量名。

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

答案 1 :(得分:11)

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 :(得分:10)

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))

答案 3 :(得分:4)

我的最佳答案如下:

file 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脚本:

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'

请注意,您无需调用任何模块;另外你可以使用任何虚拟变量代替_(它适用于ijni,或其他什么)但我建议你不要(以避免混淆)。您可以删除换行符(虽然我不建议您这样做 - 这样可以区分行)或者做任何可以用Python中的字符串做的事情。

请注意,我没有提供打开文件的模式,因此它默认为“只读” - 这不是Pythonic;在Python中“显式优于隐式”。最后,好人关闭他们的文件;在这种情况下,它是自动的(因为脚本结束),但最好使用f.close()关闭它们。

快乐的Pythoning。

编辑:正如Roger Pate所指出的那样,在列表推导中不需要方括号,从而将行减少两个字符。原始脚本已经过编辑以反映这一点。

答案 4 :(得分:1)

可能是这样的:

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

但是,对于长文件来说会很麻烦。

答案 5 :(得分:1)

我没有看到你的解决方案有任何问题,可能只是用_替换我,我也不喜欢在更简单的解决方案工作的地方调用itertools,就像人们使用jQuery进行琐碎的javascript任务一样。无论如何只是为了让itertools复仇在这里是我的解决方案

因为你想逐行阅读整个文件,为什么不首先阅读标题,然后再做你想做的事情

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

答案 6 :(得分:0)

怎么样:

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

答案 7 :(得分:0)

使用_作为虚拟变量的一个问题是它只能在一个级别上解决问题,请考虑以下内容。

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

这个函数运行正常,但m运行的_迭代器是有问题的,因为它可能与upper _冲突。无论如何,PyCharm抱怨这种语法。

所以我认为_不像以前建议的那样“一次性”。

也许您可能只想创建一个函数来完成它!

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

e.g。你可以像这样使用它:

>>> 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]

答案 8 :(得分:-1)

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()