python - pandas to_csv 创建空的、未指定的文件
问题描述
我是 python 和一般编程的新手,所以这可能是一个愚蠢的问题。
我目前正在准备一个心理学实验,使用 PsychoPy v1.90.2 独立版,python 2.7,编码器版本,基于现有脚本和同事的教程。它在我的计算机 (Mac) 和 Windows 10 计算机上完美运行,但在使用 Windows7 的计算机上,它不会将输出(即参与者的响应)保存到 csv 文件。创建一个空文件,没有任何文件说明,但文件名正确且位置正确。
- 我可以正确导入底层 csv 文件以创建刺激
- 如果我包含 print df,我可以在控制台中看到数据框,因此数据存在于某处,至少暂时存在
- 我的系统 (Mac) 是德语,但 Windows 10 和 7 计算机设置为法语
- 根本没有错误消息。
- 我之前在(比利时)法国 Mac 上成功地完成了这个实验。
from psychopy import visual, core, event, gui, info, data
import pandas as pd
import numpy as np
import os
import random
import sys
import time
GUI = gui.Dlg(title = "example")
GUI.addField('participant:')
GUI.show()
if GUI.OK:
metadata = GUI.data
else:
sys.exit('participant cancelled')
w = visual.Window([1000, 600], color='black', units='pix')
df = pd.DataFrame([[1, 2], [5, 3], [4, 6]], columns=['stim_a', 'stim_b'])
df['participant'] = int(metadata[0])
df['ans'] = ''
df = df.iloc[random.sample(df.index, len(df))]
df.index = range(len(df))
output_df = "S_" + str(df.participant) + "_df" + "_" + time.strftime("%Y-%m:%d_%Hh%M") + ".csv"
for j in range(df.shape[0]):
event.clearEvents()
stim_a = visual.TextStim(w, df.stim_a[j])
stim_a.draw()
w.flip()
resp = event.waitKeys()
df.ans[j] = resp
print df
df.to_csv(output_df, index = False, header = True, sep = ',', encoding = 'utf-8')
最后应该有什么:一个 csv 文件,其中包含最初包含在 df 中的所有信息,加上包含参与者编号的“参与者”列和包含参与者执行的按键的“ans”列。
我尝试了什么:
- 不同版本的psychopy,除了使用python 3的版本
- 我怀疑不同键盘布局的编码问题 b/c,所以我改变了它,但没有改变(并且在比利时法国计算机上不是问题)
- 此处提出的解决方案:更改 Python 的默认编码?
- 文件名中没有特殊字符,也不是所有读入的 csv 文件中都没有,但它们都没有保存。
- 在计算机上使用了管理员权限
我知道有一种比“纯”pandas 更好的方法来保存数据,方法是使用 ExperimentHandler,但是因为它以前有效,而且我到目前为止的知识仅限于我同事处理心理问题的方式,我保留了这种方法。我还有其他一些我设法解决的兼容性问题,恐怕鉴于我目前所处的时间压力,这是一种沉没成本的情况......
编辑:工作示例现在应该可以工作了,抱歉!
解决方案
脚本终止时写入(“刷新”)csv 数据。这个问题很可能是由于 Windows 7 中特定于操作系统的原因而挂起的。我以前见过这个问题,并以两种不同的方式解决了它:
在脚本终止之前关闭psychopy
将此添加到脚本的末尾:
w.close()
core.quit()
在脚本终止之前关闭 csv 文件对象
从此处的答案中复制:将df.to_csv
在脚本终止之前明确关闭文件对象的行替换为以下行。
outfile = open(output_df, 'wb')
df.to_csv(outfile, index = False, header = True, sep = ',', encoding = 'utf-8')
outfile.close()
推荐阅读
- ajax - AJAX/XMLHTTP 函数问题
- ios - 无法在其中一个变量中实例化带有“self”的结构
- c++ - 如何在 C++ 中使用 Z3
- php - 如何定义一个只有在没有参数传递给构造函数时才能实例化的类?
- javascript - 有没有办法改变 Three.js Orbit Controls 的形状?
- r - 用 geom_sf、ggplot 标记多边形
- ios - 在 iOS 应用的每个屏幕上显示一个通用计时器
- sql-server - SQL Server:如何从 WHILE 循环的多个结果中输出一个表结果
- java - BLE安卓问题
- javascript - 为什么我不能用另一个类的原型替换一个类的原型?