寻找解析文件的策略

时间:2013-08-13 02:27:57

标签: python parsing

我是一位经验丰富的C程序员,但是一个完整的python新手。我正在学习python,主要是为了好玩,作为第一个练习想要解析文本文件,从绒毛中提取有意义的位,最后用不同顺序的制表符分隔的那些位字符串。

我通过教程和文档以及堆栈溢出Q& As,快速地分割字符串和从文件中读取行等等。现在我想我需要一些经验丰富的人的路标。避免盲目的小巷。

这是我要解析的文本的一部分(您可能会将其识别为McMaster订单)。实际文件将包含一个或多个这样的块。

1   92351A603   Lag Screw for Wood, 18-8 Stainless Steel, 5/16" Diameter, 5" Long, packs of 5
Your Part Number: 7218-GYROID
22
packs   today
5.85
per pack     128.70

请注意,信息分为文件中的多行。我想最终得到一个制表符分隔的字符串,如下所示:

22\tpacks\tLag Screw for Wood, 18-8 Stainless Steel, 5/16" Diameter, 5" Long, packs of 5\t\t92351A603\t5.85\t\t128.70\t7218-GYROID\n

所以我需要提取字符串的某些部分而忽略其他部分,重新​​排列它们,然后将它们重新打包成字符串。

这是我现在的(非常早)代码,它一次读取一行文件,用分隔符拆分每行,最后我得到几个字符串列表,包括一堆空字符串是双重标签:

import sys
import string

def split(delimiters, string, maxsplit=0):
    """Split the given string with the given delimiters (an array of strings)
    This function lifted from stackoverflow in a post by Kos"""
    import re
    regexPattern = '|'.join(map(re.escape, delimiters))
    return re.split(regexPattern, string, maxsplit)

delimiters = "\t", "\n", "\r", "Your Part Number: "
with open(sys.argv[1], 'r') as f:
    for line in f:
        print(split( delimiters, line))

f.close()

问题1是基本的:如何从列表中删除空字符串,然后将所有字符串混合到一个列表中?在C中我循环遍历所有列表,忽略空格并将其他字符串粘贴到新列表中。但我有一种感觉python有一种更优雅的方式来做这种事情。

问题2更开放:这里有什么强有力的策略?我一开始应该一次阅读多行吗?制作一本字典,以便以后更容易重新订购这些项目?

对小说感到抱歉。谢谢你的任何指示。而且,风格的评论非常受欢迎,风格很重要。

2 个答案:

答案 0 :(得分:1)

使用close时,您无需with文件。

如果我要实现这个。我可能会使用一个大的正则表达式从每个块中提取部分(使用finditer),并重新组合它们以进行输出。

答案 1 :(得分:0)

您可以通过以下方式删除空字符串:

new_list = filter(None, old_list)

将第一个参数替换为要保留的元素的lambda表达式为True。传递无等同于lambda x: x

您可以使用以下方法将字符串拼接成一个字符串:

a_string = "".join(list_of_strings)

如果您有多个列表(无论如何)并且您想将它们一起合并到一个列表中,那么:

new_list = reduce(lambda x, y: x+y, old_list)

这将简单地连接它们,但您可以使用任何非空字符串作为分隔符。

如果您是Python的新手,那么像filterreduce(Python 3中的编辑deprecated这样的函数可能看起来有些陌生,但是它们节省了大量的编码时间,因此值得了解它们。

我认为你正在解决你的问题。我这样做:

  • 将所有内容分解为行
  • 将结果列表分成较小的列表,每个订单一个列表
  • 将订单解析为“有意义的东西”
  • 排序,输出结果

就个人而言,我会做一个类来处理最后两个部分(它们在逻辑上属于一种),但你可以在没有它的情况下完成。