Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何仅读取Python文件的一部分_Python_Python 3.x - Fatal编程技术网

如何仅读取Python文件的一部分

如何仅读取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(

我有一个日志文件,其中有一个标题部分,其余部分是大量数据。标头部分包含某些键值对,这些键值对告诉db表有关所述文件的信息

我的任务之一是解析出一些标题信息。另一项任务是遍历整个文件,并在出现某些字符串时解析出的计数。后面的部分我有一个函数,如下所示:

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