执行.py文件,在for循环中调用python函数

2024-06-17 09:34:59 发布

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

我有一个函数“plot_rdm”,它创建一个plot并将其保存为“rdm.png”。我希望这些绘图中的几个都使用不同的.json文件形成,因此我将函数plot_rdm保存在“plotrdm.py”中

在saverdm.py文件中,我定义了要从中创建绘图的.json文件的文件路径,然后调用plot_rdm函数,循环遍历要从中创建绘图的所有文件:

#import libraries
import numpy as np
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt
import scipy
import scipy.spatial
import scipy.spatial.distance as sd
from scipy.spatial.distance import squareform
import os
import json 

# define fpath 
#i.e. fpath[0] will be the first filepath... 

path = './RDM_researchproject' 
rootdir = path
filepath = []
for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        if file.startswith('Meadows'):
            count=0 # count default
            filepath.append(os.path.join(subdir, file))
            fpath = filepath[count]
            os.system("/home/taran/RDM_researchproject/AVIMA/plotrdm.py")
            count +=1      

带有plot_rdm函数的plotrdm.py文件如下所示:

def plot_rdm(fpath):
    import numpy as np
    import matplotlib
    import matplotlib.pyplot
    import matplotlib.pyplot as plt
    import scipy
    import scipy.spatial
    import scipy.spatial.distance as sd
    from scipy.spatial.distance import squareform
    import json 
    
    with open(fpath) as fhandle:
        data = json.load(fhandle)
     #inspect rdm stimuli labels 
    stim = data['stimuli']

    #contain all labels for y axis and x axis seperately  
    y_names = []
    for i in stim:
        y_names.append(i['name'])

    x_names = []
    for i in stim:
        x_names.append(i['name'])

    #create rdm array and squareform 
    rdm_array = np.array(data['rdm'])
    srdm = squareform(rdm_array)

    #label x and y axis on rdm 
    fig, ax = plt.subplots()
    rdm = ax.imshow(srdm)

    ax.set_xticks(np.arange(len(x_names)))
    ax.set_yticks(np.arange(len(y_names)))

    ax.set_xticklabels(x_names)
    ax.set_yticklabels(y_names)
    plt.setp(ax.get_xticklabels(), rotation=90, ha="right", rotation_mode="anchor")
    plt.plot(srdm)
    plt.imshow(srdm)
    plt.colorbar(mappable = None, cax = None, ax = None)
    fig.subplots_adjust(bottom=0.23)
import matplotlib.pyplot as plt
plt.savefig('rdm.png')

我能够单独创建绘图(即,当我不调用plot_rdm函数并循环文件,但每次都指定文件路径时)。但是当我使用下面的代码时,我在AVIMA文件夹中得到一个空的绘图。我不确定saverdm文件中的错误是什么导致了这种情况

https://github.com/Taranks7/RDM_researchproject如果我没有解释发生了什么,那么这就是我正在进行的项目

多谢各位


Tags: 文件函数importjson绘图namesplotmatplotlib
3条回答

当您想从另一个文件调用python函数时,不应该尝试通过调用os.system来运行另一个python进程。只需导入该函数: from plotrdm import plot_rdm

我们不必使用os.filewalkfile.startswith检查,而是可以通过使用nice python库glob来大量清理代码。我投了一个enumerate作为好的措施

新的rdmsave.py

import glob

from plotrdm import plot_rdm

basedir = "."

if __name__ == "__main__":
    count = 0
    for count, path in enumerate(sorted(glob.glob(f'{basedir}/**/Meadow*.json', recursive=True)), start=1):
        print(f"processing {path}")
        output_image = f'rdm_{count - 1:02}.png'
        print(f"output image will be {output_image}")
        plot_rdm(path, output_image)
    print(f"processed {count} files")

请注意,您可能需要将basedir更改回本地路径

您的绘图rdm.py将变成:

import numpy as np
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt
import scipy
import scipy.spatial
import scipy.spatial.distance as sd
from scipy.spatial.distance import squareform
import json
import matplotlib.pyplot as plt


def plot_rdm(fpath, output_filename):
    with open(fpath) as fhandle:
        data = json.load(fhandle)
        # inspect rdm stimuli labels

    stim = data['stimuli']

    # contain all labels for y axis and x axis seperately
    y_names = []
    for i in stim:
        y_names.append(i['name'])

    x_names = []
    for i in stim:
        x_names.append(i['name'])

    # create rdm array and squareform
    rdm_array = np.array(data['rdm'])
    srdm = squareform(rdm_array)

    # label x and y axis on rdm
    fig, ax = plt.subplots()
    rdm = ax.imshow(srdm)

    ax.set_xticks(np.arange(len(x_names)))
    ax.set_yticks(np.arange(len(y_names)))

    ax.set_xticklabels(x_names)
    ax.set_yticklabels(y_names)
    plt.setp(ax.get_xticklabels(), rotation=90, ha="right", rotation_mode="anchor")
    plt.plot(srdm)
    plt.imshow(srdm)
    plt.colorbar(mappable=None, cax=None, ax=None)
    fig.subplots_adjust(bottom=0.23)

    plt.savefig(output_filename)

我将第二个参数output_filename添加到了plot_rdm函数中,以便可以将每个图像存储在一个新文件中

我机器上的输出显示

processing ./5/Meadows_avima-image-version1_v_v2_vital-macaw_2_tree.json
output image will be rdm_00.png
processing ./4/Meadows_avima-image-version1_v_v2_quick-louse_2_tree.json
output image will be rdm_01.png
processing ./1/Meadows_avima-image-version1_v_v2_better-hound_2_tree.json
output image will be rdm_02.png
processing ./3/Meadows_avima-image-version1_v_v2_huge-falcon_2_tree.json
output image will be rdm_03.png
processing ./2/Meadows_avima-image-version1_v_v2_guided-koi_2_tree.json
output image will be rdm_04.png
processed 4 files

在当前文件夹中创建了4个png文件

相关问题 更多 >