我是一位经验丰富的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更开放:这里有什么强有力的策略?我一开始应该一次阅读多行吗?制作一本字典,以便以后更容易重新订购这些项目?
对小说感到抱歉。谢谢你的任何指示。而且,风格的评论非常受欢迎,风格很重要。
答案 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的新手,那么像filter
和reduce
(Python 3中的编辑:deprecated这样的函数可能看起来有些陌生,但是它们节省了大量的编码时间,因此值得了解它们。
我认为你正在解决你的问题。我这样做:
就个人而言,我会做一个类来处理最后两个部分(它们在逻辑上属于一种),但你可以在没有它的情况下完成。