如何从 Python 中的文件中提取值不同的特定数据

How do I extract specific data that varies in value from a file in Python

所以我有一个从视觉系统导入大量数据的文件。它将数据保存在一个文本文件中,大约有 4000 行文本,每个结果 1 行。我将在下面添加其中的 1 行作为示例。

11/02/1970; 11:56:44.000;ID;002914;Light Check;254;Tube Width1;38.7;Tube Width2;39.2;Tube Width3;39.9;Tube Width4;40.9;Tube Width5;41.2;Fixt Row;175.20;Fixt Col; 211.23;Post 宽度;0.00;Blob 大小;0;左角;0.00;直角;17.90;Dark Blob;0;结果;0;全局 St;14;工具标志;31;托盘号; 108;

所以我想做的是能够为每一行提取一个参数及其值。有一个分隔符;在每个 space 之间,这对我来说很困难。

因此,例如,如果我想选择 Light Check,我会得到每一行的 Light Check 结果,在本例中为 254。有人可以建议我可以使用的一些功能,这些功能可能会帮助我解决这个问题吗?

将该行拆分成字典我会这样做:

s = "11/02/1970; 11:56:44.000;ID;002914;Light Check;254;Tube Width1;38.7;Tube Width2;39.2;Tube Width3;39.9;Tube Width4;40.9;Tube Width5;41.2;Fixt Row;175.20;Fixt Col;211.23;Post Width;0.00;Blob Size;0;Left Angle;0.00;Right Angle;17.90;Dark Blob;0;Result;0;Global St;14;Tool Flag;31;Pallet No; 108;"

s = s.split(";")
data = {key: val for key, val in zip(s[::2], s[1::2])}

哪个returns

data
{'11/02/1970': ' 11:56:44.000', 'ID': '002914', 'Light Check': '254', 'Tube Width1': '38.7', 'Tube Width2': '39.2', 'Tube Width3': '39.9', 'Tube Width4': '40.9', 'Tube Width5': '41.2', 'Fixt Row': '175.20', 'Fixt Col': '211.23', 'Post Width': '0.00', 'Blob Size': '0', 'Left Angle': '0.00', 'Right Angle': '17.90', 'Dark Blob': '0', 'Result': '0', 'Global St': '14', 'Tool Flag': '31', 'Pallet No': ' 108'}

然后你可以做

data['Light Check']

获得

'254'

我建议使用正则表达式(这里是re模块),让file.txt内容为

11/02/1970; 11:56:44.000;ID;002914;Light Check;254;Tube Width1;38.7;Tube Width2;39.2;Tube Width3;39.9;Tube Width4;40.9;Tube Width5;41.2;Fixt Row;175.20;Fixt Col;211.23;Post Width;0.00;Blob Size;0;Left Angle;0.00;Right Angle;17.90;Dark Blob;0;Result;0;Global St;14;Tool Flag;31;Pallet No; 108;

然后

import re
with open("file.txt","r") as f:
    for line in f:
        print(re.search(r"Light Check;([0-9]+)",line).group(1))

输出

254

解释:我遍历了以下几行(for line in f,因此不需要将整个文件加载到内存中),然后在每一行中我找到 1 个或更多(+)个数字( [0-9]) 在 Light Check; 之后。注意数字在 () 内,它们是我使用 group(1) 访问的捕获组(第一个也是唯一一个)。免责声明:此解决方案假定 file.txt.

的每一行中存在 Light Check; 后跟 1 个或多个数字

将您的数据结构转换为字典列表:

import csv
from datetime import datetime

with open('data.txt') as fp:
    reader = csv.reader(fp, delimiter=';')
    data = []
    for row in reader:
        row = row[:-1]
        d = {'dt': datetime.strptime(row[0] + row[1], '%d/%m/%Y %H:%M:%S.%f'),
             'id': row[3]}

        keys = row[4::2]
        vals = map(float, row[5::2])
        d.update(dict(zip(keys, vals)))
        data.append(d)

输出:

>>> data
[{'dt': datetime.datetime(1970, 2, 11, 11, 56, 44),
  'id': '002914',
  'Light Check': 254.0,
  'Tube Width1': 38.7,
  'Tube Width2': 39.2,
  'Tube Width3': 39.9,
  'Tube Width4': 40.9,
  'Tube Width5': 41.2,
  'Fixt Row': 175.2,
  'Fixt Col': 211.23,
  'Post Width': 0.0,
  'Blob Size': 0.0,
  'Left Angle': 0.0,
  'Right Angle': 17.9,
  'Dark Blob': 0.0,
  'Result': 0.0,
  'Global St': 14.0,
  'Tool Flag': 31.0,
  'Pallet No': 108.0}]

搜索 Python:

out = [rec for rec in data if rec.get('Light Check') == 254]

搜索 Pandas:

df = pd.DataFrame(data)
out = df[df['Light Check'] == 254]