我正在编写的Python程序是从文件顶部读取一定数量的行,程序需要保留此标题以备将来使用。目前,我正在做类似以下的事情:
header = ''
header_len = 4
for i in range(1, header_len):
header += file_handle.readline()
Pylint抱怨我没有使用变量i
。什么是更加pythonic的方式来做到这一点?
编辑:程序的目的是智能地将原始文件拆分为较小的文件,每个文件都包含原始标题和数据的子集。因此,在读取文件的其余部分之前,我需要读取并保留标题。
答案 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'
请注意,您无需调用任何模块;另外你可以使用任何虚拟变量代替_
(它适用于i
,j
或ni
,或其他什么)但我建议你不要(以避免混淆)。您可以删除换行符(虽然我不建议您这样做 - 这样可以区分行)或者做任何可以用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()