当在MSYS2下运行(并读取文件)时,搜索结果出人意料地没有?

问题描述 投票:0回答:1

所以,这就是问题:我在Ubuntu Linux下在家编写了一段Python代码,一个简单的日志文件解析器。该代码运行良好。

现在,我恢复工作,在这里,我有一台Windows 10计算机,上面已经安装了MSYS2,并且使用了它的Python(2和3)。现在,当我在相同的文件上运行相同的代码时,我得到:

AttributeError: 'NoneType' object has no attribute 'group'

...当遇到代码时,说m.group(1),这实际上意味着变量m为None。

这里是一个测试脚本,test.py设置相同的行和相同的正则表达式-不幸的是,它不会重现该错误:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys,os
import re

line = """TEST001 sample     1/00001: X: 1 Y: 1 Z: 1 TEMPC: 25.95°C
"""
m = re.search(r"""X: (\d+?) Y: (\d+?) Z: (\d+?) TEMPC: ([\d.]+?)°C""", line)
print(line, m, type(line))

请注意,以上所有行尾均为\n(即纯LF)

[如果现在使用MSYS2中的Python运行它-MSYS2默认值(在/usr/bin/python{2,3},即C:\msys64\usr\bin\python{2,3}.exe;或者在MINGW64 shell中的Python 3,在/mingw64/bin/python3中(即, C:\msys64\mingw64\bin\python3.exe):

user@PC MSYS /tmp
$ python2 test.py
('TEST001 sample     1/00001: X: 1 Y: 1 Z: 1 TEMPC: 25.95\xc2\xb0C\n', <_sre.SRE_Match object at 0x6ffffffcca8>, <type 'str'>)

user@PC MSYS /tmp
$ python3 test.py
TEST001 sample     1/00001: X: 1 Y: 1 Z: 1 TEMPC: 25.95°C
 <re.Match object; span=(28, 57), match='X: 1 Y: 1 Z: 1 TEMPC: 25.95°C'> <class 'str'>

user@PC MSYS /tmp
$ /mingw64/bin/python3 test.py
TEST001 sample     1/00001: X: 1 Y: 1 Z: 1 TEMPC: 25.95�C
 <re.Match object; span=(28, 57), match='X: 1 Y: 1 Z: 1 TEMPC: 25.95�C'> <class 'str'>

这里注意,MSYS2 Python2不能真正打印度数的UTF-8字符(这是预期的; MSYS2 Python3 可以打印此字符-但是MINGW64 Python3再次无法打印此字符,尽管它应该打印?!

总是-我的实际工作脚本在MSYS2或MINGW64 shell中运行,通过使用/mingw64/bin/python3显式运行,因为我的实际工作脚本需要使用matplotlibnumpy,并且只能为MINGW64 shell安装。 ..但是,正如我所提到的,由于m = re.search(...)的结果是m变为None,因此程序实际上崩溃了。


编辑:我实际工作脚本中的代码是:

  with open(file_abspath, 'rt') as thelogfile:
    for line in thelogfile:
      if "something" in line: ...
      elif line.startswith("TEST001 sample"):
        m = re.search(r"""X: (\d+?) Y: (\d+?) Z: (\d+?) TEMPC: ([\d.]+?)°C""", line)
        print(line, m, type(line)) # added for debug
        ....

...并打印出来:

TEST001 sample     1/00001: X: 1 Y: 1 Z: 1 TEMPC: 25.95°C
 None <class 'str'>

...这是我在上面的示例中使用的。


我的实际工作脚本和带有数据行的文件都具有Unix行尾(\n,即LF)-并且,我尝试通过在test.py上面使用纯文本来模拟它Unix行尾。

[任何人都不会知道,为什么我的实际工作脚本逐行读取文件时会失败(即,re.search的结果为None),但在解析完全相同的行时却失败了,而没有如上述摘要所示,test.py出现问题?

python regex mingw-w64 msys2
1个回答
1
投票

我推测您输入文件中的一行或多行,即您上面测试的行not,不符合您所期望的模式。这是一个建议的脚本,您可以尝试清除不匹配的行:

filepath = 'your_input.csv'
with open(filepath) as fp:
    line = fp.readline()
    cnt = 1
    while line:
        m = re.search(r"""X: (\d+?) Y: (\d+?) Z: (\d+?) TEMPC: ([\d.]+?)°C""", line)
        if not m:
            print("Line #" + str(cnt) + " has a problem: " + line)
        line = fp.readline()
        cnt += 1

假设只有几行令人反感的行,您也许可以手动编辑文件并修复数据。

© www.soinside.com 2019 - 2024. All rights reserved.