Python2.7:变量;“未定义”;

Python2.7:变量;“未定义”;,python,python-2.7,nested,Python,Python 2.7,Nested,我正在使用它来完成一些与ECG信号分析相关的任务。我想读取.MAT文件,提取文件上的MLII读数(位于第1行),使用“增益”和“基”将信号调整为mV(位于Physionet提供的.INFO字段中),最后打印信号值及其周期 我想写一个脚本,可以对一个文件夹中的所有文件执行所有这些操作。在此之前,我写了一篇文章,上面提到的每一件事我都能做到,而且效果很好 但是管理文件夹中所有.mat和.info文件的脚本给了我变量方面的问题。在我接二连三的IFs开始时,我尝试使用“global”命令,但它一直发送类

我正在使用它来完成一些与ECG信号分析相关的任务。我想读取.MAT文件,提取文件上的MLII读数(位于第1行),使用“增益”和“基”将信号调整为mV(位于Physionet提供的.INFO字段中),最后打印信号值及其周期

我想写一个脚本,可以对一个文件夹中的所有文件执行所有这些操作。在此之前,我写了一篇文章,上面提到的每一件事我都能做到,而且效果很好

但是管理文件夹中所有.mat和.info文件的脚本给了我变量方面的问题。在我接二连三的IFs开始时,我尝试使用“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
>文件“C:blabla\Multiple.mat files\ecg_mat_multi.py”,第24行,在
信号向量_2=np.真除法((信号向量增益),基)
NameError:未定义名称“增益”
问题来自变量“增益”、“基”和“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']
        ...

我正在处理你的第一次编辑,所以我将包括这一点,即使问题已经简化

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

由于文件结构良好,您可能可以通过计算行数并使用
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

你还没有告诉我们错误是什么。什么变量没有定义?您可以通过查找单词“采样频率”的字符串索引来获取频率,然后在后面查找相应的字符,即:
index=your_string.index('Sampling frequency:')
frequency=your_string[(index+20):(index+23)]
如果是
If file.endswith(“.info”)
的计算结果为
False
您的名字如
gain
base
等未定义,因为只有当表达式的计算结果为
True
时才会初始化它们,在某些情况下,您的程序会尝试处理不符合该标准的文件。不要一次问3个问题。专注于一个问题。你得到的错误是因为之前没有定义增益。原因是“如果”条件从来都不是真的。因此,
file.endswith(“.info”)
总是错误的,这很好。专门用于读取.info文件的函数。Physionet提供了一个Matlab脚本,它以类似的方式扫描字符串,就像您在这里所做的那样。我想自己做,但我做不到。这真的帮了我大忙。我几乎没有几天时间用Python做事情,这个任务对于消除疑虑和提出新问题非常有用。谢谢!
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