使用时赋值前引用的变量有问题操作系统路径.

2024-06-25 23:08:41 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧。我有一些Matlab的背景知识,现在我转向Python。 我在64位Linux上的Pythnon 2.6.5下有这段代码,它在目录中滚动,找到名为'通用数据.dat,从中检索一些数据并将它们缝合到新的数据集中:

import pylab as p
import os, re
import linecache as ln

def LoadGenomeMeanSize(arg, dirname, files):
        for file in files:
            filepath = os.path.join(dirname, file)
            if filepath == os.path.join(dirname,'GeneralData.dat'):
                data = p.genfromtxt(filepath)
                if data[-1,4] != 0.0: # checking if data set is OK 
                    data_chopped = data[1000:-1,:] # removing some of data
                    Grand_mean = data_chopped[:,2].mean()
                    Grand_STD = p.sqrt((sum(data_chopped[:,4]*data_chopped[:,3]**2) + sum((data_chopped[:,2]-Grand_mean)**2))/sum(data_chopped[:,4]))
                else:
                    break
            if filepath == os.path.join(dirname,'ModelParams.dat'):
                l = re.split(" ", ln.getline(filepath, 6))
                turb_param = float(l[2])                
                arg.append((Grand_mean, Grand_STD, turb_param))

GrandMeansData = []
os.path.walk(os.getcwd(), LoadGenomeMeanSize, GrandMeansData)
GrandMeansData = sorted(GrandMeansData, key=lambda data_sort: data_sort[2])

TheMeans = p.zeros((len(GrandMeansData), 3 ))
i = 0
for item in GrandMeansData:
    TheMeans[i,0] = item[0]
    TheMeans[i,1] = item[1]
    TheMeans[i,2] = item[2]
    i += 1

print TheMeans # just checking...
# later do some computation on TheMeans in NumPy

它让我想起了这个(尽管我发誓这是一个月的自我):

^{pr2}$

好吧。。。所以我去读了一下,得出了一个全局变量:

import pylab as p
import os, re
import linecache as ln

Grand_mean = p.nan
Grand_STD = p.nan
def LoadGenomeMeanSize(arg, dirname, files):
        for file in files:
            global Grand_mean
            global Grand_STD
            filepath = os.path.join(dirname, file)
            if filepath == os.path.join(dirname,'GeneralData.dat'):
                data = p.genfromtxt(filepath)
                if data[-1,4] != 0.0: # checking if data set is OK 
                    data_chopped = data[1000:-1,:]  # removing some of data
                    Grand_mean = data_chopped[:,2].mean()
                    Grand_STD = p.sqrt((sum(data_chopped[:,4]*data_chopped[:,3]**2) + sum((data_chopped[:,2]-Grand_mean)**2))/sum(data_chopped[:,4]))
                else:
                    break
            if filepath == os.path.join(dirname,'ModelParams.dat'):
                l = re.split(" ", ln.getline(filepath, 6))
                turb_param = float(l[2])                
                arg.append((Grand_mean, Grand_STD, turb_param))

GrandMeansData = []
os.path.walk(os.getcwd(), LoadGenomeMeanSize, GrandMeansData)
GrandMeansData = sorted(GrandMeansData, key=lambda data_sort: data_sort[2])

TheMeans = p.zeros((len(GrandMeansData), 3 ))
i = 0
for item in GrandMeansData:
    TheMeans[i,0] = item[0]
    TheMeans[i,1] = item[1]
    TheMeans[i,2] = item[2]
    i += 1

print TheMeans # just checking...
# later do some computation on TheMeans in NumPy

它不提供错误消息。甚至给了一个包含数据的文件。。。但数据是大错特错了!我通过运行命令手动检查了其中一些:

import pylab as p
data = p.genfromtxt(filepath)
data_chopped = data[1000:-1,:]
Grand_mean = data_chopped[:,2].mean()
Grand_STD = p.sqrt((sum(data_chopped[:,4]*data_chopped[:,3]**2) \
+ sum((data_chopped[:,2]-Grand_mean)**2))/sum(data_chopped[:,4]))

在选定的文件上。它们是不同的:-(

1)谁能给我解释一下怎么了?在

2)有人知道解决办法吗?在

我将非常感谢您的帮助:-)

干杯, PTR


Tags: pathimportdataifosmeanitemstd
3条回答

使用global不是正确的解决方案。只有当你确实想引用并分配到全局“Grand_mean”名称时,这才有意义。解释器需要在解释器中指定运算符。在

您应该首先在LoadGenomeMeanSize()的范围内为Grand_mean分配一个默认值。您有4个分支中的1个实际为Grand_mean赋值,该值在一个循环迭代中具有正确的语义意义。你可能会遇到一个

if filepath == os.path.join(dirname,'ModelParams.dat'):为真,但是 if filepath == os.path.join(dirname,'GeneralData.dat'):或{}不是。这很可能是第二个对你不利的条件。移动

快速而肮脏的答案是,您可能需要像这样重新排列代码:

...
            if filepath == os.path.join(dirname,'GeneralData.dat'):
                data = p.genfromtxt(filepath)
                if data[-1,4] != 0.0: # checking if data set is OK 
                    data_chopped = data[1000:-1,:]  # removing some of data
                    Grand_mean = data_chopped[:,2].mean()
                    Grand_STD = p.sqrt((sum(data_chopped[:,4]*data_chopped[:,3]**2) + sum((data_chopped[:,2]-Grand_mean)**2))/sum(data_chopped[:,4]))

                    if filepath == os.path.join(dirname,'ModelParams.dat'):
                        l = re.split(" ", ln.getline(filepath, 6))
                        turb_param = float(l[2])                
                        arg.append((Grand_mean, Grand_STD, turb_param))
                else:
                    break

...

我看到代码和您提供的解决方案有一个问题。在

Never hide the issue of "variable referencing before assignment" by just making the variable visible. Try to understand why it happened?

在创建全局变量“Grand_mean”之前,您遇到了一个问题,即在分配任何值之前访问Grand_mean。在这种情况下,通过在函数外部初始化变量并将其标记为全局变量,只会隐藏问题。在

你看到了错误的结果,因为现在你已经使变量可见,我使它成为全局变量,但问题仍然存在。你的意思是从来没有得到正确的数据。在

这意味着“if filepath==os.path.join操作系统(dirname,…”从未执行过。在

我想说这个条件没有通过: if filepath == os.path.join(dirname,'GeneralData.dat'):

也就是说你得不到通用数据.dat以前模型参数.dat. 也许你需要按字母顺序排序,或者文件不在那里。在

相关问题 更多 >