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个iterablezip
也会在最小的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个iterablezip
也会在最小的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)-我已经修正了我的代码