gpt4 book ai didi

Python:编写一次读取多行的解析器时出现文件结尾

转载 作者:行者123 更新时间:2023-12-01 05:12:05 25 4
gpt4 key购买 nike

我正在编写一个解析器对象,我想了解指示文件结尾的最佳实践。看起来代码应该是这样的。

myFp = newParser(filename)  # package opens a file pointer and scans through multiple lines to get an entry
while entry in myFp:
yourCode(entry)

我看到raising an exception is better than returning a status call但这个案子的处理方式似乎有所不同。

由于解析器正在读取多行,我不能只将 readline() 的结果发送回代码链,因此 while 循环在我当前的实现中无限运行。

def read(this):
entry = ''
while 1:
line = this.fp.readline()
if line = '\\':
return entry
else:
entry += line
return entry

有人可以告诉我该对象在读取时是如何构造的,以便在这种情况下退出 while 循环吗?

最佳答案

这是一个非常简化的示例,因为您还没有真正准确地指出您的解析器的作用。但它至少应该帮助您了解一般概念。首先,让我们构建一个generator当它遍历文件时,它将yield token 。

在这个简化的示例中,我将假设每个标记都包含在一行中,并且该行仅包含一个标记,但您可能可以推断出如何扩展它以允许这些约束不被正确。

def produce_token(line):
# produce a token from a line here
return token

def tokenizer(file_to_tokenize):
# will iterate over a file, producing a token from each line
for line in file_to_tokenize:
# If a token isn't constrained to a line, you don't
# HAVE to yield every iteration. You can also yield
# more than once per iteration
yield produce_token(line)

接下来,让我们生成一个 contextmanager这将允许我们从文件名自动生成一个tokenizer,并在最后处理关闭它:

@contextmanager
def tokenize_file(filename):
with open(filename) as f:
yield tokenizer(f)

以下是使用它的方法:

filename = 'tokens.txt'
with tokenize_file(filename) as tokens:
for token in tokens:
# do something with token

希望这能为您指明正确的方向。显然,在我的玩具示例中,它非常简单,与直接迭代行相比并没有多大好处(简单地 [product_token(line) for line in token_file] 会快得多) 。但是,如果您的标记化过程更复杂并且您这样扩展它,那么当您实际使用它时,这可以使您的过程变得更加简单。

关于Python:编写一次读取多行的解析器时出现文件结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980783/

25 4 0
文章推荐: python - 使用 BioPython 根据限制序列过滤 FASTA 文件
文章推荐: javascript - 使用 cookies 在 jQuery 中关闭后不显示弹出窗口
文章推荐: jQuery 显示/隐藏单个页面中多个不相关的单选按钮集的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com