2

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

我已经通过教程和文档以及stackoverflow问答,愉快地拆分字符串和从文件中读取行等等。现在我想我正处于需要有经验的人提供一些路标以避免死胡同的地步。

这是我要解析的一段文本(您可能会将其识别为 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 更为开放:这里的稳健策略是什么?我应该一次读多行吗?制作一本字典,以便以后更轻松地重新排序项目?

对不起小说。感谢您的任何指示。并且请,风格评论非常受欢迎,风格很重要。

4

2 回答 2

1

使用时无需close备案with

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

于 2013-08-13T03:12:16.883 回答
0

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

new_list = filter(None, old_list)

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

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

a_string = "".join(list_of_strings)

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

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

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

如果您是 Python 新手,那么filterreduce( EDIT :在 Python 3 中已弃用) 之类的函数可能看起来有点陌生,但它们可以节省大量编码时间,因此值得了解它们。

我认为您在解决问题方面处于正确的轨道上。我会这样做:

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

就个人而言,我会创建一个类来处理最后两个部分(它们在逻辑上属于一起),但没有它你也可以过得去。

于 2013-08-13T02:35:44.430 回答