【问题标题】:Parsing text with Python 2.7使用 Python 2.7 解析文本
【发布时间】:2015-09-01 08:06:03
【问题描述】:

文本文件

• 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())

我的代码完全符合我的要求,但我认为有一种更快或更简洁的方式来完成操作。让我们提高效率!

【问题讨论】:

    标签: python string python-2.7 split string-formatting


    【解决方案1】:

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

    如果您删除 linearray = parts_info.readlines( 行,Python 会理解只使用带有打开文件的 for 循环,这样如果您的文件很大,这会使整个事情流式传输。目前,该行代码会尝试一次将整个文件读入内存,而不是逐行读取,因此如果文件大于内存,则会导致计算机崩溃。

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

    保存line.split(':') 之类的结果会有所帮助。

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

    【讨论】:

      【解决方案2】:

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

      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'
      

      【讨论】:

      • [A-Z\d]+',s ',s' 和 '\d\ 对正则表达式有什么作用?
      • @KehlinSwain 抱歉,line\d 将匹配 0-9 之间的任何数字
      【解决方案3】:

      我想到了一些事情:

      • 您可以执行一次 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())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2016-06-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        • 1970-01-01
        相关资源
        最近更新 更多