繁体   English   中英

使用Python 2.7解析文本

[英]Parsing text with Python 2.7

文本文件

• I.D.: AN000015544 
DESCRIPTION: 6 1/2 DIGIT DIGITAL MULTIMETER 
MANUFACTURER: HEWLETT-PACKARDMODEL NUM.: 34401A CALIBRATION - DUE DATE:6/1/2016 SERIAL NUMBER: MY45027398 
• I.D.: AN000016955 
DESCRIPTION: TEMPERATURE CALIBRATOR 
MANUFACTURER: FLUKE MODEL NUM.: 724 CALIBRATION - DUE DATE:6/1/2016 SERIAL NUMBER: 1189063 
• I.D.: AN000017259 
DESCRIPTION: TRUE RMS MULTIMETER 
MANUFACTURER: AGILENT MODEL NUM.: U1253A CALIBRATION - DUE DATE:6/1/2016 SERIAL NUMBER: MY49420076 
• I.D.: AN000032766                         
DESCRIPTION: TRUE RMS MULTIMETER                            
MANUFACTURER: AGILENT MODEL NUM.: U1253B CALIBRATION    -   DUE DATE:6/1/2016   SERIAL  NUMBER: MY5048  9036

目的

寻求更有效的算法来解析制造商名称和编号。 即'HEWLETT-PACKARDMODEL NUM。:34401A','AGILENT MODEL NUM。:U1253B'......等。 从上面的文本文件。

数据结构

parts_data = {'Model_Number': []}

with open("textfile", 'r') as parts_info:
    linearray = parts_info.readlines(
    for line in linearray:
        model_number = ''
        model_name = ''
        if "MANUFACTURER:" in line:
            model_name = line.split(':')[1]
        if "NUM.:" in line:
            model_number = line.split(':')[2]
            model_number = model_number.split()[0]
            model_number = model_name + ' ' + model_number
            parts_data['Model_Number'].append(model_number.rstrip())

我的代码正是我想要的,但我认为有更快或更简洁的方法来完成动作。让我们提高效率!

你的代码看起来很好,除非你解析的数据超过GB,否则我不知道这是什么意思。 我想到了一些事情。

如果删除linearray = parts_info.readlines(行Python的理解只使用一个for循环以开放的文件,这样会做这件事的情况下, 流媒体文件巨大,目前该行代码会试图读取整个文件到内存一次,而不是逐行,所以如果你的文件大于你的记忆,你将崩溃您的计算机。

您也可以组合if语句并执行1条件,因为您似乎只关心这两个字段。 为了更清洁的代码,你也不需要model_number = ''; model_name = '' model_number = ''; model_name = ''

保存line.split(':')类的结果可以提供帮助。

或者,您可以尝试使用正则表达式。 如果不对两者进行测试,就无法确定哪一个会表现得更好,这让我回到了开头所说的内容:优化代码很棘手,如果没有必要,真的不应该这样做。 如果你真的非常关心效率,你会使用像用C语言写的awk这样的程序。

一种直接的方法是使用正则表达式:

with open("textfile", 'r') as parts_info:
     for line in parts_info:
          m=re.search(r'[A-Z ]+ NUM\.: [A-Z\d]+',line)
          if m:
                print m.group(0)

结果:

'PACKARDMODEL NUM.: 34401A', 
' FLUKE MODEL NUM.: 724', 
' AGILENT MODEL NUM.: U1253A', 
' AGILENT MODEL NUM.: U1253B'

我想到了一些事情:

  • 您可以执行split(':')一次并重复使用它
  • 如果数:始终是相同的,然后扔掉IFS与长度检查一次

我正在完成这样的事情

parts_data = {'Model_Number': []}
with open("textfile.txt", 'r') as parts_info:
    linearray = parts_info.readlines()

for line in linearray:
    linesp = line.split(':')
    if len(linesp)>2:
        model_name = linesp[1]
        model_number = linesp[2]
        model_number = model_number.split()[0]
        model_number = model_name + ' ' + model_number
        parts_data['Model_Number'].append(model_number.rstrip())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM