如何将数据输出到文件?

时间:2016-05-24 19:17:05

标签: python user-interface psychopy

所以我试图从头开始编写一个Stroop实验。 理想情况下,这就是我想要设置实验的方式:

  1. 输入参与者信息
  2. 说明页面(点击x继续)
  3. 说明第2页(点击x继续)
  4. 实验开始
  5. 中断试用
  6. 实验试验2
  7. 结束
  8. (将有超过2次试验,但仅使用2次试验)

    我在将数据写入文本文件时遇到困难。第二个试验完美地记录了每个循环的不同值。但是,第一次试验显示为重复,每个试验在文本文件中具有相同的值。

    此外,我无法弄清楚如何将弹出窗口中的数据写入我的文本文件。 (即主题名称,年龄,身份证)

    还有一种方法我每次都可以输入文件名吗?不改变代码? - 或许像弹出窗口一样选择路径和文件名?

    谢谢!

    from psychopy import visual, core
    import random
    import time
    import datetime
    import sys
    from psychopy import gui
    from psychopy import event
    
    
    
    #Write to file, need to figure out how to choose file name in each instance
    file = open ("Test Output.txt", 'w')
    
    
    #Pop up subject information - need to figure out how to output this data
    myDlg = gui.Dlg(title="TEST TEXT BOX")
    myDlg.addText('Subject info')
    myDlg.addField('Name:')
    myDlg.addField('Age:', )
    myDlg.addText('Experiment Info')
    myDlg.addField('Subject ID', "#" )
    myDlg.addField('Group:', choices=["Test", "Control"])
    ok_data = myDlg.show()
    if myDlg.OK:
        print(ok_data)
    else:
        print('user cancelled')
    
    #opens up window w/ text, 
    win = visual.Window([800,800],monitor="testmonitor", units="deg")
    msg = visual.TextStim(win, text="Hello")
    msg.draw()
    win.flip()
    event.waitKeys(maxWait=10, keyList=None, timeStamped=False) #page remains until keyboard input, or max of 10 seconds
    
    #with keyboard input, second screen will come up
    msg = visual.TextStim(win, text="Instructions 1")
    msg.draw()
    win.flip()
    event.waitKeys(maxWait=10, keyList=None, timeStamped=False)
    
    #3rd screen will pop up with keyboard input
    msg = visual.TextStim(win, text="Trial 1")
    msg.draw()
    win.flip()
    event.waitKeys(maxWait=10, keyList=None, timeStamped=False)
    
    
    #Trial starts,
    for frameN in range(5):
        MyColor = random.choice(['red','blue','green','yellow'])
        Phrase = random.choice(["Red","Green", "Blue", "Yellow"])
        time = str(datetime.datetime.now())
        key = str(event.getKeys(keyList=['1','2','3','4','5'], ))
        pause = random.randint(1200,2200)/1000.0
        length = str(pause)
        msg = visual.TextStim(win, text=Phrase,pos=[0,+1],color=MyColor)
        msg.draw()
        win.flip()
        core.wait(pause)
    
    
    msg = visual.TextStim(win, text="Break between trial")
    msg.draw()
    win.flip()
    event.waitKeys(maxWait=10, keyList=None, timeStamped=False)
    
    #trial 2
    for frameN in range(5):
        MyColor2 = random.choice(['red','blue','green','yellow'])
        Phrase2 = random.choice(["Red","Green", "Blue", "Yellow"])
        time2 = str(datetime.datetime.now())
        key2 = str(event.getKeys(keyList=['1','2','3','4','5'], ))
        pause2 = random.randint(1200,2200)/1000.0
        length2 = str(pause2)
        msg = visual.TextStim(win, text=Phrase2,pos=[0,+1],color=MyColor2)
        msg.draw()
        win.flip()
        core.wait(pause2)
    
    #specifying which data will be recorded into the file
        data = "Stimuli:"+ MyColor + ',' + Phrase + ','+  time + ',' + key + ',' + length + MyColor2 + ',' + Phrase2 + ','+  time2 + ',' + key2 + ',' + length2
    
        file.write(data  + '\n')
    
    
    
    
    
    
    
    
    
    #Jessica's Code.
    

2 个答案:

答案 0 :(得分:1)

你应该考虑使用PsychoPy内置的TrialHandler和/或ExperimentHandler类:他们已经为你解决了这个问题(以及更多问题)。你不需要重新发明轮子。

即。定义试验参数(在您的情况下,颜色和短语)并在创建时将它们提供给TrialHandler。然后,它将自动循环每个试验(按顺序或随机,根据需要),并自动处理在结构化文件中保存数据。从实验信息对话框收集的数据与数据一起保存,因为在创建extraInfoTrialHandler时,从对话框收集的信息字典可以作为ExperimentHandler参数传递。 / p>

PsychoPy数据API位于:http://www.psychopy.org/api/data.html,并且在TrialHandlerExperimentHandler菜单下有Demosexp control使用的示例。或者检查任何简单的Builder生成的代码,用于包含循环的实验。例如,Builder Stroop演示;-) Builder代码非常详细,但只需查看创建试用/实验处理程序的部分以及如何控制实验循环。

答案 1 :(得分:0)

您是否考虑过使用命令行参数?这将允许您在脚本开头传递文件名。例如:

python myscript.py InputFile1 InputFile2 OutputFile1 OutputFile2

有一个非常好的模块为你做了很多繁重的工作,称为argparse: https://docs.python.org/3/library/argparse.html

如果您有点害怕,这是文档提供的教程: https://docs.python.org/3/howto/argparse.html

如果您需要Python 2文档,则可以在URL中将3更改为2。这是一个小代码示例,向您展示您可以使用它做什么:

import argparse

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--input", required = True, help = "Path to input file")
ap.add_argument("-o", "--output", required = True, help = "Path to output file")
args  = vars(ap.parse_args())

print(args["input"])
print(args["output"])

然后,您可以从终端调用此文件来传递您的文件位置(或您想传递的任何其他内容):

python myscript.py -i File1.txt -o File2.txt

然后,您将从上面代码中的两个print语句中获得以下输出:

File1.txt
File2.txt

所以你现在可以使用args ["输入"]和args ["输出"]告诉你的程序需要从哪里得到它的输入和输出而不直接把它放入你的代码。