随机在Python中随机播放两个CSV文件

时间:2017-07-03 18:23:55

标签: python csv random shuffle

不幸的是,我在编程方面没有太多经验,但我希望用Python实现以下目标(当有人帮助我做和理解时,我会非常高兴):

我有两个csv文件,比如list1.csv和list2.csv,我希望在以下方式随机随机播放后将它们组合在一个新的csv中:假设list1.csv具有以下结构:

Header1 Header2
A       1
B       2
C       3
…       …

我想要将两列的元素(但不是标题)混洗,但要将每行中的元素保持在一起,例如:

Header1 Header2
B       2
A       1
C       3
…       …

对于list2.csv,我想做同样的事情,它有相同的结构,即:

Header3 Header4
a       x1
b       x2
c       x3
…       …

最后,我想将它们粘合在一个新的,单独的csv中(csv中的各个项目是实验的刺激),结果如下:

Header1 Header2 Header3 Header4
B       2       c       x3
C       3       a       x1
A       1       b       x2
…       …       …       …

我想,我必须做以下事情(基于我用Google搜索的内容):

#I actually do not know why I write this :)
import random 

#I guess this activates the import of a csv :)
import csv 

#Import the first csv file and store it in a variable
#I also want to tell Python that I want him to ignore the headers, but later on I need them back somehow :o
list1=list(csv.reader(open('list1.csv', header=None))) 

正如你所说,我对此非常不熟悉:(我想我将来需要学习一些Python!

根据我的阅读,我认为我需要提取行并将其与zip()粘合在一起,然后使用random.shuffle()

我希望我清楚自己的目标是什么,我会非常感谢你们的帮助:)

2 个答案:

答案 0 :(得分:0)

我是这样做的。

import random

import csv

list1 = list(csv.reader(open('list1.csv')))
list2 = list(csv.reader(open('list2.csv')))
header1, header2 = list1.pop(0), list2.pop(0)
random.shuffle(list1)
random.shuffle(list2)
list1 = [header1]+list1
list2 = [header2]+list2
listout = [list1[i] + list2[i] for i in range(len(list1))]
outputwriter = csv.writer(open("listout.csv", "wb"))
outputwriter.writerows(listout)

逐行:

import random

导入随机库,其中包含有用的函数,如random.shuffle。不确定你是否知道库是什么,但基本上他们添加了你可以使用的某些函数和类。

import csv

导入csv库。

list1 = list(csv.reader(open('list1.csv')))
list2 = list(csv.reader(open('list2.csv')))

读取两个文件的内容,并将每一行作为列表的元素。

header1, header2 = list1.pop(0), list2.pop(0)

将标题(列表的第一个元素)从列表中取出并存储起来供以后使用。

random.shuffle(list1)
random.shuffle(list2)

将列表随机排列。

list1 = [header1]+list1
list2 = [header2]+list2

将标题放回列表的前面。你不能使用+ =因为这会将它们放在列表的后面。您需要将它们放在括号中,因为它们是一个列表,所以如果将它们直接添加到另一个列表中,header1的每个元素将成为一个单独的元素,而不是作为列表保留在list1中,这是我们想要的,因为这是编写csv所需的格式。

listout = [list1[i] + list2[i] for i in range(len(list1))]

这是一个列表理解,它将list1的每个元素与list2的元素相加,将它们连接起来形成一个包含所有4列的列表,

outputwriter = csv.writer(open("listout.csv", "wb"))
outputwriter.writerows(listout)

这些在listout.csv上打开一个csv编写器,然后将listout写入它。

答案 1 :(得分:0)

只需将csvs中的数据添加到单个列表中,然后将其随机播放

>>> import csv, pprint
>>> from random import shuffle
>>> allData = []
>>> 
>>> with open('list1.csv', 'rb') as f:
...     reader = csv.reader(f)
...     next(reader)
...     for row in reader:
...             allData += [row]
... 
['Header1', 'Header2']
>>> with open('list2.csv', 'rb') as f:
...     reader = csv.reader(f)
...     next(reader)
...     for row in reader:
...             allData += [row]
... 
['Header3', 'Header4']
>>> shuffle(allData)
>>> pprint.pprint(allData)
[['b', 'x2'], ['a', 'x1'], ['A', '1'], ['B', '2'], ['C', '3'], ['c', 'x3']]