在csv文件中存储不同的列表 - 不覆盖上一次添加

时间:2018-02-18 13:56:02

标签: python

我是Python的新手,不知何故不能完成这个简单的任务。

我已经生成了一些随机化的图像,我想稍后在实验中向每位参与者展示。随机化为每个参与者分配要呈现的图像列表的特定顺序。随机化如下:

all_images_face = ["01_1.jpg","02_1.jpg", "03_1.jpg", "04_1.jpg", "05_1.jpg", 
                   "06_1.jpg", "07_1.jpg", "08_1.jpg", "09_1.jpg","10_1.jpg"]
all_images_scene = ["01_2.jpg", "02_2.jpg", "03_2.jpg", "04_2.jpg", "05_2.jpg", 
                    "06_2.jpg", "07_2.jpg", "08_2.jpg", "09_1.jpg", "10_2.jpg]

ind_scene = range(len(all_images_scene))
len_scene = len(all_images_scene)

for p in range (0,participants): #for each participant
    rand_ind_face=random.sample(range(len(all_images_face)),len(all_images_face)/2) 
    TLS = []
    list_scene = [] 

    while True:
        for i in range(0,len_scene):
            print "loop round: ", i
            if ind_scene[i] not in rand_ind_face[:]: 
                el = ind_scene[i]
                TLS.append(el)
                list_scene.append(el)
                print "list_scene: ", list_scene
                print "TLS: ", TLS
            if len(TLS) == 0:
                EF = "Error"

    list_all = TLS + rand_ind_face # scenes + faces

    final_scene = [] # list to retrieve elements from index
    final_face = []

    for i in list_all[:len(all_images_face)/2]: # first half scenes
        all_images_scene[i]
        final_scene.append(all_images_scene[i])

    for i in list_all[len(all_images_face)/2:]: # second half faces
        all_images_face[i]
        final_face.append(all_images_face[i])

    str_all = final_scene + final_face
    print str_all 

# needed data
    random.shuffle(str_all) #shuffle order of scene/face of stimuli
    print str_all

# write the str_all into csv 
    fp = open('list_stim.csv','w')
    wr = csv.writer(fp,delimiter = ',')
    wr.writerow(str_all)

    if p == participants:
    fp.close()

例如,我最终得到了一个类似于p == 1的列表:

str_all = ['01_2.jpg', '06_2.jpg', '08_1.jpg', '04_2.jpg', '10_1.jpg', 
           '07_2.jpg', '02_1.jpg', '05_2.jpg', '09_1.jpg', '03_1.jpg']

对于每个参与者,这个随机的字符串名称列表是不同的。我想将每个新str_all列表存储到同一cvs文件的新行中,其中每个元素对应一列(意味着每个添加的行都是针对每个新参与者)。我用Excel手动创建了一个名为list_stim.csv的csv文件。

这最后一个代码允许我添加我新创建的str_all列表,但是当我再次运行循环时(对于p == 2),它不会添加新列表但会覆盖旧列表。

 # write the str_all into csv 
    fp = open('list_stim.csv','w')
    wr = csv.writer(fp,delimiter = ',')
    wr.writerow(str_all)

2 个答案:

答案 0 :(得分:0)

这很容易存储在json-string文件中。以下是一个示例:

import json
import os
import random

def func_returns_imagelist():
    # Do some magic here
    l = ['01_2.jpg', '06_2.jpg', '08_1.jpg', '04_2.jpg', '10_1.jpg', 
           '07_2.jpg', '02_1.jpg', '05_2.jpg', '09_1.jpg', '03_1.jpg']  
    random.shuffle(l)  
    return l

def open_database(s):
    # Load database if exist, else set d to empty dict
    if os.path.isfile(s):   
        with open(s) as f:
            return json.load(f)
    else:   
        return {}

def save_database(s,d):
    # Save to file
    with open(s, 'w') as f:
        json.dump(d,f,indent=2)

def main():
    pathtofile = 'mydb.json'
    d = open_database(pathtofile)
    d['participant{}'.format(len(d)+1)] = func_returns_imagelist()
    save_database(pathtofile,d)

main()
  1. 此函数将尝试打开一个名为' mydb.json'的文件。并将数据作为字典返回,如果它不存在则创建它。
  2. 它将添加具有该功能的参与者(func_returns_imagelist)
  3. 它会将文件保存回json。
  4. 尝试多次运行,您可以看到文件(' mydb.json')每次都在增长。

答案 1 :(得分:0)

在上面粘贴的代码中,我看不到任何遍历str_all长度的循环,因为可以看到你正在调用str_all[i]。 我认为适合你的解决方案是:

fp = open('list_stim.csv','w')
wr = csv.writer(fp,delimiter = ',')
wr.writerow(str_all)
fp.close()

这会将str_all写入CSV。列表str_all中的每个项目都是CSV文件中的一列。

从问题来看,似乎你想写多个这样的列表。

所以你必须定义一个包含所有这个列表的列表。我在这里展示一个例子:

str_all1=['01_2.jpg', '06_2.jpg', '08_1.jpg', '04_2.jpg','10_1.jpg']
str_all2=[ '10_1.jpg','01_2.jpg', '06_2.jpg', '08_1.jpg','03_1.jpg']
str_all3=['06_2.jpg', '08_1.jpg','01_2.jpg', '04_2.jpg', '10_1.jpg']
big_str = [str_all1,str_all2,str_all3]
fp = open('list_stim.csv','w')
wr = csv.writer(fp,delimiter = ',')
for i in range(len(big_str)):
    wr.writerow(big_str[i])
fp.close()

Output