如何仅读取Python文件的一部分
我有一个日志文件,其中有一个标题部分,其余部分是大量数据。标头部分包含某些键值对,这些键值对告诉db表有关所述文件的信息 我的任务之一是解析出一些标题信息。另一项任务是遍历整个文件,并在出现某些字符串时解析出的计数。后面的部分我有一个函数,如下所示:如何仅读取Python文件的一部分,python,python-3.x,Python,Python 3.x,我有一个日志文件,其中有一个标题部分,其余部分是大量数据。标头部分包含某些键值对,这些键值对告诉db表有关所述文件的信息 我的任务之一是解析出一些标题信息。另一项任务是遍历整个文件,并在出现某些字符串时解析出的计数。后面的部分我有一个函数,如下所示: with open(filename, 'rb') as f: time_data_count = 0 while True: memcap = f.read(102400) # f.seek(
with open(filename, 'rb') as f:
time_data_count = 0
while True:
memcap = f.read(102400)
# f.seek(-tdatlength, 1)
poffset_set = set(config_offset.keys())
# need logic to check if key value exists
time_data_count += memcap.count(b'TIME_DATA')
if len(memcap) <= 8:
break
if time_data_count > 20:
print("time_data complete")
else:
print("incomplete time_data data")
print(time_data_count)
打开(文件名“rb”)作为f的:
时间\数据\计数=0
尽管如此:
memcap=f.read(102400)
#f.seek(-tdatlength,1)
poffset\u set=set(config\u offset.keys())
#需要逻辑来检查键值是否存在
时间数据计数+=memcap.count(b‘时间数据’)
如果len(memcap)20:
打印(“数据完成时间”)
其他:
打印(“不完整的时间数据”)
打印(时间\数据\计数)
现在的问题是,这不是一个需要大量时间的逐行处理。我只想得到这个日志的前50行,然后解析它们。然后让函数的其余部分遍历整个文件,而不逐行进行计数
是否可以在不查看整个文件的情况下提取前50行?
前50行包含表单的标题信息
产品编号:A785X
我真正需要的是在日志文件中获取ProdID的值,您可以使用
for
循环或列表理解来读取下一行50次,从而逐行读取前50行。这会在文件中向下移动读取指针,因此当您调用.read()
或任何其他方法时,您将不会得到任何已使用的内容。然后,您可以批量处理其余部分,或者您需要:
with open(filename, 'rb') as f:
first_50_lines = [next(f) for _ in range(50)] # first 50 lines
remainder_of_file = f.read() # however much of the file remains
只要相同的文件对象(
f
,在本例中)始终处于活动状态,就可以交替使用各种方法读取文件。一行一行,一块一块地调整大小,或者一次全部调整大小(尽管.read()
总是会妨碍进一步的处理,因为一次消耗整个内容)。等等,我看到一个列表。。。列表理解如何移动读取指针?它怎么知道我们所说的范围?它怎么知道50是行而不是字符?“for”之后和“in”之前的“uu”还有什么作用@绿色斗篷Guy@edo101文件对象是一种迭代器。当您迭代一个文件时,它返回的每个项目都是该文件中的一行(这是文件所属对象类型的显式定义行为-[line for line in f]
在功能上与f.readlines()
相同)。与所有迭代器一样,您可以对文件调用next()
,以获取单个元素-这是一行。文件的行为是,当您以任何容量读取任何信息时,“读取”指针在文件中移动。同样,如果您读取12个字节,或者“直到下一个\n
”,任何单个字节将只读取一次。@edo101我使用for在范围(50)
中,只是为了在迭代中计数到50-理解会连续调用next()
50次,并将结果列成一个列表。至于read指针,每当从文件中读取内容时,它都会自动向前移动。如果需要,可以使用f.seek()
将读取指针重置为特定点,但如果没有,则不会读取同一文件对象的任何部分两次。在这方面,它的工作方式可能与Java中的扫描器的工作方式相同。这是不是告诉它移到f中的下一项?那么,如果是的话,为什么在for后面有一个“uu”?我想,因为文件对象是迭代器,所以50被视为文件中的行?所以,当你说50行时,你实际上要增加到50行?我也应该在列表理解之后直接使用while语句块吗?@Green-clope-Guy