首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >目录名称中的循环(字符串错误)

目录名称中的循环(字符串错误)
EN

Stack Overflow用户
提问于 2016-07-05 08:00:21
回答 2查看 37关注 0票数 1

我对python相当陌生,所以我为没有最优的代码而提前道歉:)

无论如何,我正在尝试使用matplotlib包进行一些绘图,目前正在这样做:

代码语言:javascript
运行
复制
import os
import numpy as np
import matplotlib.pyplot as plt
import re

PATH_TO_YDATA1 = '401\PTV-06'
PATH_TO_YDATA2 = '401\PTV-11'
PATH_TO_YDATA3 = '401\PTV-16'
PATH_TO_YDATA4 = '401\PTV-21'
PATH_TO_YDATA5 = '401\PTV-26'
PATH_TO_YDATA6 = '401\PTV-31'
PATH_TO_YDATA7 = '401\PTV-36'
PATH_TO_YDATA8 = '401\PTV-REF'

x = np.loadtxt('401\dosex.txt')*1.1

path = [1, 2, 3, 4, 5, 6, 7, 8]

for pathnumber in path:
    pathname = "%s%d" %("PATH_TO_YDATA", pathnumber)
    print pathname
    for f in sorted(os.listdir(pathname), key=lambda f: int(f.split('-')[-2])):
        y = np.loadtxt(pathname + '/' + f)
        if int(f.split('-')[-2]) < 90:
            plt.plot(x, y*100, color='#70ad47', linestyle='dashed', linewidth=1.0, label=f.split('-')[-2] + '/' + str(360 - int(f.split('-')[-2])))
        elif int(f.split('-')[-2]) == 90:
            plt.plot(x, y * 100, color='#5b9bd5', linestyle='solid', linewidth=2.0, label=f.split('-')[-2] + '/' + str(360 - int(f.split('-')[-2])))
        elif int(f.split('-')[-2]) > 90:
            plt.plot(x, y * 100, color='#ed7d31', linestyle='dashed', linewidth=1.0, label=f.split('-')[-2] + '/' + str(360 - int(f.split('-')[-2])))
        plt.subplot(2, 4, 1)
        plt.axis([0, 100, 0, 100])
        plt.grid(True)
    plt.title(re.split('[- .]', f)[-2])

plt.plot((77, 77), (0, 100), 'k-')
plt.show()

我知道,它也可以循环通过PATH_TO_YDATA# = ...,而不是有8行。但我只是一步一步地走:)

Nopw,我的问题是,在"print“行中,我实际上得到了第一个循环的PATH_TO_YDATA1输出,然后它就会以错误结束:

代码语言:javascript
运行
复制
WindowsError: [Error 3] The system cannot find the path specified: 'PATH_TO_YDATA1/*.*'

我知道,如果我只输入PATH_TO_YDATA1而不是路径名,代码就可以工作了。所以我的猜测是,它与文件夹的路径有关,可能不是字符串或什么的。然而,我似乎无法弄清楚如何将它变成“非字符串”,这样代码就会读取它是一个路径目录,而不仅仅是一些随机文本。

因此,基本上,如果我手动输入PATH_TO_YDATA#而不是使用循环路径名,代码就可以工作,因此缺陷在路径名循环中。

提前谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-05 08:06:26

在您的循环中,pathname并不是指您前面定义的变量,它只是一个字符串。要从包含变量名的字符串中获取变量(实际路径)的值,可以使用eval(pathname)。例如:

代码语言:javascript
运行
复制
PATH_TO_YDATA1 = '401\PTV-06'
PATH_TO_YDATA2 = '401\PTV-11'
PATH_TO_YDATA3 = '401\PTV-16'

path = [1,2,3] 

for pathnumber in path:
    path = "%s%d"%("PATH_TO_YDATA",pathnumber)
    print(path, eval(path))

指纹:

PATH_TO_YDATA1 401\PTV-06 PATH_TO_YDATA2 401\PTV-11 PATH_TO_YDATA3 401\PTV-16

票数 2
EN

Stack Overflow用户

发布于 2016-07-05 09:49:25

我强烈推荐另一种方法。顺便说一句:如果你需要求助于eval,很可能(但不确定)你做的事情是错误的。

在本例中,使用一个列表,而不是大量的单个变量:

代码语言:javascript
运行
复制
PATHS_TO_YDATA = [ 
    '401\PTV-06', 
    '401\PTV-11', 
    ... 
    '401\PTV-REF',
]

for i,name in enumerate( PATHS_TO_YDATA):
     print( "Path to YDATA number {} is {}" .format( i+1, name ) )

您可能实际上不需要索引i。如果只想按顺序处理其名称包含在列表PATHS_TO_YDATA中的文件,只需使用

代码语言:javascript
运行
复制
for name in PATHS_TO_YDATA:
    # process name
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38198137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档