我是python的新手,所以我提前道歉没有最优的代码:)
无论如何,我正在尝试使用matplotlib包进行一些绘图,目前正在进行此处:
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 pathname”行,我实际上为第一个循环得到PATH_TO_YDATA1
的输出,然后它就会因错误而停止:
WindowsError: [Error 3] The system cannot find the path specified: 'PATH_TO_YDATA1/*.*'
我知道如果我只输入PATH_TO_YDATA1
而不是两个地方的路径名,代码就有效。所以我的猜测是,它与文件夹的路径有关可能不是字符串或其他东西。但是,我似乎无法弄清楚如何将其变成“非字符串”,因此代码将读取它是一个路径目录,而不仅仅是一些随机文本。
基本上,如果我手动输入PATH_TO_YDATA#
而不是使用循环路径名,代码就可以工作,因此缺陷位于路径名循环中。
提前致谢!
答案 0 :(得分:2)
在你的循环中,pathname
并不是指你之前定义的变量,它只是一个字符串。要从包含变量名称的字符串中获取变量(实际路径)的值,可以使用eval(pathname)
。例如:
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
答案 1 :(得分:1)
我强烈推荐一种不同的方法。顺便说一下:如果你需要诉诸eval
,很可能(但不确定)你做错了事。
在这种情况下,使用列表,而不是许多单个变量:
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
中的文件,请使用
for name in PATHS_TO_YDATA:
# process name