我确定我错过了一些明显的事情,可能之前已经问过但我似乎无法将关键字组合在一起给我一个答案。
如何写出文件的前n行(实际上与file.readlines()[0:10]
相反)?
e.g。我有一个接收输入文件的函数,需要处理后一部分的信息,抛出一个标题。但是我想保留多行标题,将其放回输出文件中。
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
然后我想用输入文件的格式写出来,使用标题:
print(header)
for thing in usefulstuff:
print(thing)
我是否缺少一种方法,或readlines
对此没有好处,因为它会返回一个列表?
我假设
for line in header:
print(line)
会起作用,但在这种情况下似乎没有 - 所以我一定做错了什么?
修改
为什么在第二个范围内尝试使用readlines()[]
两次失败?
我修改了代码,因为@pbuck指出,标题行应该是readlines()
而不是readline
,但现在noheader
变量是空的?我真的要打开文件两次吗?!
答案 0 :(得分:2)
在那里小心,readline()
会返回一个字符串,因此ifh.readline()[0:10]
会为您提供第一行的前几个字符,noheader = ifh.readline()[11:]
会为您提供下一行的一部分。
你可以做的就是使用这样的循环:
header = ""
for i in range(10):
header += ifh.readline()
或者正如@pbuck在评论中建议的那样,使用readlines()
(注意s),它会返回一个包含文件中每一行的列表,看起来更像是你想要做的。
答案 1 :(得分:1)
从字面上看,先读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
答案 2 :(得分:0)
没有两个readlines()
来电。最初,您调用readline()
,从文件中读取一行。接下来,您调用readlines()
并忽略它返回的列表的前10行。
这是一种更好的方法:
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)
答案 3 :(得分:0)
我已检查过您的解决方案,并且它已接近您的正确状态。使用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))