【问题标题】:Randomly Shuffle Two CSV Files Independently in Python在 Python 中独立随机随机播放两个 CSV 文件
【发布时间】:2017-07-03 18:23:54
【问题描述】:

不幸的是,我没有太多编程经验,但我想用 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
…       …       …       …

我认为,我必须执行以下操作(基于我一起搜索的内容):

#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()

我希望我很清楚我的目标是什么,如果能得到一些帮助,我会非常感激:)

【问题讨论】:

    标签: python csv random shuffle


    【解决方案1】:

    这就是我的做法。

    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 写入它。

    【讨论】:

    • 非常感谢!这正是我想要的! :* 感谢您的 cmets!非常感谢您帮助我了解这些线条的作用!
    【解决方案2】:

    只需将 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']]
    

    【讨论】:

    • 非常感谢!我补充说:import csv with open("output.csv", "wb") as f: writer = csv.writer(f) writer.writerows(allData) 不幸的是,标题现在消失了,表格看起来像这样:A 1 F 6 a x1 b x2 B 2 E 5 e x5 D 4 d x4 C 3 f x6 c x3 这是否源于我将其写入 csv 的方式? (编辑:A 1 之后、F 6 之后、x1 之后等应该有一个换行符)
    • 不,你是对的。读取 csv 文件时 next(reader) 绕过每个文件的第一行。所以,如果你想像其他人一样将标题保持为正常行,请注释这两行代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2017-07-15
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    相关资源
    最近更新 更多