[英]Python 2.7: Variable “is not defined”
我将Physionet的数据库用于与ECG信号分析有关的一些任务。 我想读取.MAT文件,提取文件上的MLII读数(位于第1行),使用“增益”和“基数”(位于Physionet也提供的.INFO文件中)将信号调整为mV,最后进行打印信号值及其周期。
我想编写一个脚本,可以对一个文件夹中的所有文件执行所有这些操作。 在此之前,我写了一篇我可以做的上述所有内容,并且效果很好。
但是,用于管理文件夹中所有.mat和.info文件的脚本给我带来了变量问题。 我在继承IF的一开始就尝试使用“全局”命令,但它始终发送类似的错误消息。
这是代码:
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
和slices提取信息。
此函数使用正则表达式模式提取信息:
# 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.