gpt4 book ai didi

python - 用Python设计一个可重用的解析器

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

我正在编写一个文件解析器,我希望能够确定它将为我返回的“数据字段”。

我开始学习Python,并且仍然习惯像Java程序员一样思考,所以这个问题更多的是关于如何设计我的模块而不是如何具体解析文件。

结合上下文,文件的每一行都有固定数量的字符,并且每个信息都包含在特定的索引之间。例如:

XX20120101NAME1CITYA
XY20120101NAME2CITYB

在这个虚构的示例中,从索引 0 到 2 有一个信息,从 2 到 10 有另一个信息,依此类推...

使用 Java,我通常会创建一个代表不同信息的枚举器,每个枚举器“存储”开始索引结束索引。在我的解析类中,我将设计一个方法来接受n个不同的枚举。例如:

enum FileInformation {
INFO01(0,2), INFO02(2,10), INFO03(10,15), INFO04(15,20);
int startIndex;
int endIndex;

public FileInformation(int si, int ei) {
this.startIndex = si;
this.endIndex = ei;
}

public int getStartIndex() { return si; }
public int getEndIndex() { return ei; }
}

public Whatever parse(FileInformation... infos) {
// Here I would iterate through infos[],
// using its start and end index to retrieve only what I need.
}

我知道我可能不应该在python中使用同一行,特别是因为该语言不允许它(Python中没有枚举)并且因为我想象python 可以更简洁,但我不知道有什么好的设计实践可以实现同样的结果。

值得一提的是,我不想让模块的用户面临不必要的复杂性,或者强制他知道每个信息的索引。模块的用户最好能够确定他想要的信息及其顺序。

那么,对于以优雅的方式解决这个需求,您有什么见解吗?提前致谢

最佳答案

Python 已经有一个内置类型可以完成 FileInformation 的功能 - 查看 slice .

以下是您的模块的外观:

# module dataparser.py

INFO01, INFO02, INFO03, INFO04 = map(slice, ((0,2),(2,10),(10,15),(15,20)))

def parse(infos, data):
return [data[info] for info in infos]

以及调用模块如何使用它:

# module dataparser_user.py

import dataparser as dp

data = """\
XX20120101NAME1CITYA
XY20120101NAME2CITYB""".splitlines()

for d in data:
print d, dp.parse((dp.INFO01, dp.INFO03), d)

# or use partial to define a function object that takes your
# subset number of slices
from functools import partial
specific_parse = partial(dp.parse, (dp.INFO01, dp.INFO03))

for d in data:
print d, specific_parse(d)

如果你要在Python中实现你自己的enum模拟,我认为namedtuple将是最接近的(就像你的Java enum有 getters 但没有 setters - namedtuple 同样是不可变的):

from collections import namedtuple
FileInformation = namedtuple("FileInformation", "start end")
INFO01, INFO02, INFO03, INFO04 = map(FileInformation, ((0,2),(2,10),(10,15),(15,20)))

关于python - 用Python设计一个可重用的解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11911716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com