文本文件
• 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
目标
寻求更有效的算法来解析制造商名称和编号。即“惠普型号:34401A”、“安捷伦型号: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 = ''
保存诸如 line.split(':')
之类的结果会有所帮助。
或者,您可以尝试正则表达式。如果不对两者都进行测试,就不可能判断哪一个会表现得更好,这让我回到了我一开始所说的:优化代码很棘手,如果没有必要,真的不应该这样做。如果你真的非常关心效率,你会使用像 awk
这样用 C 编写的程序。
关于python - 使用 Python 2.7 解析文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30868697/