如何打印文件的前n行?
How to print the first n lines of file?
我确信我遗漏了一些明显的东西并且可能以前被问过,但我似乎无法将正确的关键字组合在一起给我一个答案。
如何写出文件的前 n 行(实际上,与 file.readlines()[0:10]
相反)?
例如我有一个接受输入文件的函数,需要处理后面部分的信息,抛出一个header。但是我想保留 multi-line header,将其放回输出文件中。
def readInfile(infile):
with open(infile, 'r') as ifh:
# Skip exta info at top of file
header = ifh.readline()[0:10] # Keep the header for later?
noheader = ifh.readlines()[11:]
for line in noheader:
# Do the useful stuff
usefulstuff = foo()
return usefulstuff, header
然后我想用输入文件的格式写出来,用他们的header:
print(header)
for thing in usefulstuff:
print(thing)
有没有我遗漏的方法,或者 readlines
对它没有好处,因为它 returns 是一个列表?
我假设
for line in header:
print(line)
会起作用,但在这种情况下似乎不起作用 - 所以我一定是做错了什么?
编辑
为什么在第二个范围内尝试使用 readlines()[]
两次失败?
我按照@pbuck 指出的那样修改了代码,header 行应该是readlines()
而不是readline
但现在noheader
变量是空的?我真的必须打开文件两次吗?!
注意,readline()
returns 是一个字符串,所以 ifh.readline()[0:10]
给你第一行的前几个字符, noheader = ifh.readline()[11:]
给你一部分下一行。
您可以像这样使用循环:
header = ""
for i in range(10):
header += ifh.readline()
或者正如@pbuck 在他们的评论中所建议的那样,使用 readlines()
(注意 s),其中 returns 是一个包含文件中每一行的列表,看起来更像你想要的做。
从字面上看,先读 n 行,然后停止。
def read_first_lines(filename, limit):
result = []
with open(filename, 'r') as input_file:
# files are iterable, you can have a for-loop over a file.
for line_number, line in enumerate(input_file):
if line_number > limit: # line_number starts at 0.
break
result.append(line)
return result
没有两次 readlines()
调用。最初你调用 readline()
从文件中读取一行。接下来调用 readlines()
并忽略列表的前 10 行 returns.
这样做会更好:
def foo(lines):
return ['foo: ' + line for line in lines]
def readInfile(infile):
with open(infile, 'r') as ifh:
lines = ifh.read().splitlines(False) # read in the whole file, separate into lines
header = lines[:10]
usefulstuff = foo(lines[10:])
return usefulstuff, header
usefulstuff, header = readInfile('name_of_file.txt')
for line in header:
print(line)
for line in usefulstuff:
print(line)
我已经检查了你的解决方案,它表明你正在走上正轨。考虑使用 mmap python 包 (https://docs.python.org/2/library/mmap.html) 的解决方案,您可以在其中将文件视为字符串和文件。这是我的解决方案:
import mmap
def main(offset):
with open("pks.txt","r+b") as fd:
#Get the lines to skip
try:
skip=fd.readlines()[0:offset]
lines=sum([len(x) for x in skip])
rfile=mmap.mmap(fd.fileno(),0)
rfile.seek(lines)
print("Header: %s"%skip)
print("Other lines:")
line=rfile.readline()
usefulStuff=list()
while (len(line)>0):
usefulStuff.append(line.lstrip()) #Remove new line
line=rfile.readline()
return usefulStuff,skip
except TypeError as e:
#Handle this error when offset is greater than the file length
print("Error: %s"%str(e))
return None,None
if __name__=='__main__':
footer,header=main(3)
print("Header: %s\nFooter: %s"%(header,footer))
我确信我遗漏了一些明显的东西并且可能以前被问过,但我似乎无法将正确的关键字组合在一起给我一个答案。
如何写出文件的前 n 行(实际上,与 file.readlines()[0:10]
相反)?
例如我有一个接受输入文件的函数,需要处理后面部分的信息,抛出一个header。但是我想保留 multi-line header,将其放回输出文件中。
def readInfile(infile):
with open(infile, 'r') as ifh:
# Skip exta info at top of file
header = ifh.readline()[0:10] # Keep the header for later?
noheader = ifh.readlines()[11:]
for line in noheader:
# Do the useful stuff
usefulstuff = foo()
return usefulstuff, header
然后我想用输入文件的格式写出来,用他们的header:
print(header)
for thing in usefulstuff:
print(thing)
有没有我遗漏的方法,或者 readlines
对它没有好处,因为它 returns 是一个列表?
我假设
for line in header:
print(line)
会起作用,但在这种情况下似乎不起作用 - 所以我一定是做错了什么?
编辑
为什么在第二个范围内尝试使用 readlines()[]
两次失败?
我按照@pbuck 指出的那样修改了代码,header 行应该是readlines()
而不是readline
但现在noheader
变量是空的?我真的必须打开文件两次吗?!
注意,readline()
returns 是一个字符串,所以 ifh.readline()[0:10]
给你第一行的前几个字符, noheader = ifh.readline()[11:]
给你一部分下一行。
您可以像这样使用循环:
header = ""
for i in range(10):
header += ifh.readline()
或者正如@pbuck 在他们的评论中所建议的那样,使用 readlines()
(注意 s),其中 returns 是一个包含文件中每一行的列表,看起来更像你想要的做。
从字面上看,先读 n 行,然后停止。
def read_first_lines(filename, limit):
result = []
with open(filename, 'r') as input_file:
# files are iterable, you can have a for-loop over a file.
for line_number, line in enumerate(input_file):
if line_number > limit: # line_number starts at 0.
break
result.append(line)
return result
没有两次 readlines()
调用。最初你调用 readline()
从文件中读取一行。接下来调用 readlines()
并忽略列表的前 10 行 returns.
这样做会更好:
def foo(lines):
return ['foo: ' + line for line in lines]
def readInfile(infile):
with open(infile, 'r') as ifh:
lines = ifh.read().splitlines(False) # read in the whole file, separate into lines
header = lines[:10]
usefulstuff = foo(lines[10:])
return usefulstuff, header
usefulstuff, header = readInfile('name_of_file.txt')
for line in header:
print(line)
for line in usefulstuff:
print(line)
我已经检查了你的解决方案,它表明你正在走上正轨。考虑使用 mmap python 包 (https://docs.python.org/2/library/mmap.html) 的解决方案,您可以在其中将文件视为字符串和文件。这是我的解决方案:
import mmap
def main(offset):
with open("pks.txt","r+b") as fd:
#Get the lines to skip
try:
skip=fd.readlines()[0:offset]
lines=sum([len(x) for x in skip])
rfile=mmap.mmap(fd.fileno(),0)
rfile.seek(lines)
print("Header: %s"%skip)
print("Other lines:")
line=rfile.readline()
usefulStuff=list()
while (len(line)>0):
usefulStuff.append(line.lstrip()) #Remove new line
line=rfile.readline()
return usefulStuff,skip
except TypeError as e:
#Handle this error when offset is greater than the file length
print("Error: %s"%str(e))
return None,None
if __name__=='__main__':
footer,header=main(3)
print("Header: %s\nFooter: %s"%(header,footer))