Python 2.7 : Variable "is not defined"

标签 python python-2.7 nested

我正在使用Physionet's data base用于一些与心电图信号分析相关的任务。我想读取 .MAT 文件,提取文件上的 MLII 读数(位于第 1 行),使用“增益”和“基数”将信号调整为 mV(位于也由 Physionet 提供的 .INFO 文件中),最后打印信号值及其周期。

我想编写一个脚本,可以对一个文件夹中的所有文件执行所有这些操作。在此之前,我写了一篇文章,其中我可以完成上述所有操作,并且效果很好。

但是管理文件夹中所有 .mat 和 .info 文件的脚本给我带来了变量问题。我尝试在连续 IF 的一开始就使用“global”命令,但它不断发送类似的错误消息。

这是代码:

import os
import scipy.io as sio
import numpy as np
import re
import matplotlib.pyplot as plt

for file in os.listdir('C:blablablablabla\Multiple .mat files'):
    if file.endswith(".mat"):
        file_name=os.path.splitext(file)
        ext_txt=".txt"
        ext_info=".info"
        if file.endswith(".info"):
            f=open(file_name[0]+ext_info,'r')
            k=f.read()
            f.close()
            j=re.findall('\d+', k)
            Fs=j[9]
            gain=j[13]
            base=j[14]

        RawData=sio.loadmat(file)
        signalVectors=RawData['val']
        [a,b]=signalVectors.shape
        signalVectors_2=np.true_divide((signalVectors-gain),base)
        ecgSignal=signalVectors_2[1,1:]
        T=np.true_divide(np.linspace(1,b,num=b-1),Fs)
        txt_data=np.array([ecgSignal, T])
        txt_data=txt_data.T
        f=open(file_name[0]+ext_name,'w')
        np.savetxt(file_name[0]+ext_txt,txt_data,fmt=['%.8f','%.8f'])
        f.close()

我收到的错误消息是:

> File "C:blablablablabla\Multiple .mat files\ecg_mat_multi.py", line 24, in <module>
    signalVectors_2=np.true_divide((signalVectors-gain),base)
NameError: name 'gain' is not defined

问题出在变量“gain”、“base”和“Fs”上。我尝试将它们定义为全局变量,但这没有什么区别。您能帮我解决这个错误吗?

非常感谢您的时间和帮助。

编辑1:复制脚本下方的错误消息。 编辑 2:更改了帖子标题并删除了其他问题。

最佳答案

在处理数据文件之前使用两个循环并提取信息

for filepath in os.listdir('C:blablablablabla\Multiple .mat files'):
    if filepath.endswith(".info"):
        Fs, gain, base = get_info(filepath)
        break
for file in os.listdir('C:blablablablabla\Multiple .mat files'):
    if file.endswith(".mat"):
        file_name=os.path.splitext(file)
        ...
        RawData=sio.loadmat(file)
        signalVectors=RawData['val']
        ...
<小时/>

我正在完成您的第一次编辑,因此即使问题已经简化,我也会将其包括在内

# foo.info
Source: record mitdb/100 Start: [00:00:10.000]
val has 2 rows (signals) and 3600 columns (samples/signal)
Duration: 0:10
Sampling frequency: 360 Hz Sampling interval: 0.002777777778 sec
Row Signal  Gain    Base    Units
1   MLII    200 1024    mV
2   V5  200 1024    mV

To convert from raw units to the physical units shown
above, subtract 'base' and divide by 'gain'.

我还会编写一个返回您想要的信息的函数。使用函数来提取信息可以使循环中的代码更具可读性,并且可以更轻松地测试提取。

由于文件结构良好,您可以迭代行并通过计算行数并使用 str.split 和切片来提取信息。

此函数使用正则表达式模式来提取信息:

# regex patterns
hz_pattern = r'frequency: (\d+) Hz'
mlii_pattern = r'MLII\t(\d+)\t(\d+)'

def get_info(filepath):
    with open(filepath) as f:
        info = f.read()
    match = re.search(hz_pattern, info)
    Fs = match.group(1)
    match = re.search(mlii_pattern, info)
    gain, base = match.groups()
    return map(int, (Fs, gain, base))
<小时/>

如果目录中有多个 .info 和 .mat 文件,您需要确保提取正确的数据信息。由于 .info 文件与其所属的 .mat 文件同名,因此按名称对目录列表进行排序,然后按名称进行分组 - 这将确保您正在操作相关的两个文件彼此。

import itertools
def name(filename):
    name, extension = filename.split('.')
    return name

files = os.listdir('C:blablablablabla\Multiple .mat files')
files.sort(key = name)
for fname, _ in itertools.groupby(files, key = name):
    fname_info = name + '.info'
    fname_data = name + '.mat'
    Fs, gain, base = get_info(fname_info)
    # process datafile

关于Python 2.7 : Variable "is not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40100405/

相关文章:

javascript - Elm:端口在嵌套模块中不起作用

bash - Grep $value `grep $value2 ` <command >`` - 嵌套 grep?

c++ - 从文件中读取 SCons 环境设置

python - 将装饰器应用于装饰器

Python请求库——获取SSL证书信息

python - 为什么python 2.7中的字符串没有 "__iter__"属性,但python 3.7中的字符串有 "__iter__"属性

python - 检查一个值在 While 循环 Python 中是否仍然保持不变

c# - 从 MongoDB 查询嵌套对象(第 2 部分)

python - python 中的访问被拒绝

python - 删除 matplotlib 中子图上的重叠刻度线