用python2.7解析文本

2024-05-08 17:03:58 发布

您现在位置:Python中文网/ 问答频道 /正文

文本文件

• 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

目标

寻求一种更有效的算法来解析制造商名称和编号。i、 e“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())

我的代码正是我想要的,但是我认为有一种更快更干净的方法来完成这个任务行动。让我们提高效率!你知道吗


Tags: numberdatemodellineserialdescriptionnumdue
3条回答

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

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

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

如果删除linearray = parts_info.readlines(行,Python就可以理解,只要在打开的文件中使用for循环,这样就可以在文件很大的情况下使整个事情流化。目前,这行代码将尝试一次将整个文件读入内存,而不是逐行读取,因此如果文件大于内存,则会导致计算机崩溃。你知道吗

您还可以组合if语句和do 1条件语句,因为您似乎只关心这两个字段。为了更干净的代码,您也不需要model_number = ''; model_name = ''

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

或者,你可以试试正则表达式。如果不同时测试两者,就不可能判断哪一个会表现得更好,这让我回到了我一开始所说的:优化代码是很棘手的,如果没有必要的话,真的不应该这样做。如果你真的,真的关心效率,你会使用一个像awk这样用C写的程序

相关问题 更多 >

    热门问题