解析格式化文本fi的python方法

2024-06-06 03:32:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在我学习python的正确方法中,我想解析一个以这种方式格式化的文本文件:

game (
    name "Chess (1981)(M.C. Rakaska, S.W. Huggins) [Strategy, Chess].zip"
    file ( name Chess.bas size 19129 date 2007/01/31 19:46:20 crc 50577473 )
    file ( name Chess.exe size 46464 date 1998/12/25 19:46:00 crc 826d1c0d )
    file ( name file_id.diz size 198 date 2014/11/23 07:53:32 crc 72399680 )
)

像那样有多个条目。在

阅读完这里和那里有很多方法可以做到这一点。我可以手动解析它(strippin,查找数据等),我可以使用某种regexp来解析行,甚至我已经找到了一个PyParse模块(对我来说有点复杂)。在

我确信有一种更像python的方法,可以手工完成,也许使用PyParse?用手做这件事似乎很快。。。在

这类文件包含在zip文件中,许多文件大小约为50MB,但我已经解决了在内存中加载文本文件并剥离头文件的问题。在

有什么正确的方法吗?在


Tags: 文件方法namegamesizedate方式zip
2条回答

最后,在阅读了这里和那里和许多测试后,我来到了这个。在

这是一个更大的循环的提取,我在这里解析文件中的其他类型的数据。 来自其他语言(c++、Pascal、PHP)的python3.x处理字符串的方式对我来说有点奇怪。我发现,从ZIP文件内部读取时,我得到的字符串是二进制格式(字节),所以我必须在很多站点中使用“b”,但这可能是另一个问题的素材。在

不管怎样,这对我很有效。在

gdregex = re.compile(r"file\s*\(\s*name\s+(.+)\s+size\s+(\d+)\s+date\s+(.+)\s+crc\s+([0-9a-fA-F]{8})\s*\)", re.IGNORECASE | re.VERBOSE | re.MULTILINE)

with zipfile.ZipFile(dat_file) as datz:
    with datz.open('filetoprocess.txt') as datf:
        for line in datf:
            line=line.strip().lower()
            if line.startswith(b"game ("):
            # New entry
                is_new_entry = True
                entry = []
                continue
            if is_new_entry:
                if line.startswith(b"name"):
                    gamename = str(line[len("name")+2:])
                if line.startswith(b"file"):
                    line = str(line)
                    gamedatarx = gdregex.split(line,0)
                    entry = []
                    entry.append(gamename)
                    entry.extend(gamedatarx[1:4])
                    print(entry)
            if line==b')' and is_new_entry:
                is_new_entry = False

基本上这取决于数据的不规则性。 我在这里可以看到两种并发症

  1. 游戏名称用双引号括起来。但是如果这个名字也包含双qoutes怎么办?

  2. 如果文件名包含空格怎么办?

似乎这两个问题都可以通过使用内置的re模块中的常规表达式得到充分处理。因此,请记住Zen of Python,在这种情况下,没有必要使其更复杂并使用完整的解析器。在

相关问题 更多 >