Python 3.x 如何在Python中传递文件指针

Python 3.x 如何在Python中传递文件指针,python-3.x,Python 3.x,我在某个班上遇到过这种情况- def f1(self, xxx): do stuff with lines from file def f0(self, filename): with open(filename) as fp: for lineContent in fp: if re.match(lineContent): do stuff with next 100+ lines from file

我在某个班上遇到过这种情况-

def f1(self, xxx):
    do stuff with lines from file

def f0(self, filename):
    with open(filename) as fp:
        for lineContent in fp:
            if re.match(lineContent):
                do stuff with next 100+ lines from file
                continue
            else:
                do other stuff while parsing lines
问题:使用函数f1(…)的最佳方式是什么

选项1:捕获数组中的行,直到有哨兵,然后将此数组作为f1()的xxx参数传递

选项2:将f1()的代码内容嵌入f0()。这也行得通,但f0()变得非常大且难以读取

正在寻找:使用文件指针调用f1()的某种方法,以便该方法可以读取/处理行、监视sentinel并在完成后将控制返回f0()

与perl等效的代码(我正在寻找的代码)是:

sub f1 { ... }
sub f0 { ...
    while (<$fp>) {
        f1($fp) if /$re2match/;
        continue with other stuff
    }
}
sub f1{…}
子f0{。。。
而(){
f1($fp)if/$re2match/;
继续做其他事情
}
}
谢谢你帮助一个新的蟒蛇

def f1(self, filepointer):
    for _, line in zip(range(100), filepointer):
        # do stuff with the line


def f0(self, filename):
    with open(filename) as infile:
        for lineContent in infile:
            if re.match(lineContent):
                f1(infile)  # only works because of the way file iterators are set up. Otherwise, that for-loop's scoping iterator will bork you here
                # that continue is unnecessary here
            else:
                # do other stuff while parsing lines
更新:根据评论进行澄清

是一个函数,它接受多个iterable(如列表、文件、字典等)并返回一个元组iterable,其中每个元组的第i个元素来自输入到
zip
的第i个iterable
zip
也会在最小的iterables用尽时终止。那么,看看这个:

In [14]: for t in zip('asdf', '1234'): print(t)

('a', '1')
('s', '2')
('d', '3')
('f', '4')

In [15]: for t in zip('asdf', '123'): print(t)
('a', '1')
('s', '2')
('d', '3')
由于您要求处理接下来的100行,
range(100)
似乎是理想的工具
for u,line in…
类似于说
for a,line in…
,只是下划线用来表示我们不想跟踪的变量(尝试
打印
ing
查看循环的每次迭代中它的值)。
如果您不知道要处理多少行的确切计数,这对您来说是一个错误的解决方案

更新:根据评论进行澄清

是一个函数,它接受多个iterable(如列表、文件、字典等)并返回一个元组iterable,其中每个元组的第i个元素来自输入到
zip
的第i个iterable
zip
也会在最小的iterables用尽时终止。那么,看看这个:

In [14]: for t in zip('asdf', '1234'): print(t)

('a', '1')
('s', '2')
('d', '3')
('f', '4')

In [15]: for t in zip('asdf', '123'): print(t)
('a', '1')
('s', '2')
('d', '3')
由于您要求处理接下来的100行,
range(100)
似乎是理想的工具
for u,line in…
类似于说
for a,line in…
,只是下划线用来表示我们不想跟踪的变量(尝试
打印
ing
查看循环的每次迭代中它的值)。

如果您不知道要处理的行数,这对您来说是一个错误的解决方案。

谢谢。后续-(1)您能解释一下zip(范围(…)部分吗,因为要处理的行的确切数量未知。结果是什么?(2) f0()中的for循环是否应该使用infle而不是fp?@ManidipSengupta:更新了我的答案。好主意(2)-我已经修好了密码谢谢。后续-(1)您能解释一下zip(范围(…)部分吗,因为要处理的行的确切数量未知。结果是什么?(2) f0()中的for循环是否应该使用infle而不是fp?@ManidipSengupta:更新了我的答案。很好的理解(2)-我已经修正了我的代码