使用python随机化csv文件

时间:2015-03-26 00:32:09

标签: python csv shuffle

我是python的新手,很想得到一些帮助。

我有一个包含2列的csv文件,请注意:

1 A

2 B

3 C

4 D

我的目标是使用python来打开"该文件,读取它,随机化两个列表的顺序(即1与C相同,2与D等),然后将新的随机列表保存在不同的csv文件中。

谢谢,

编辑:



import csv
import random
f=open('my_file.csv')
csv_f=csv.reader(f)




我读了一些关于作家的东西。但不确定如何使用这些功能..

编辑2: 有人刚刚发表了一篇好评,但出于某种原因,我现在无法看到它。唯一的问题是我需要保持列标题完整,它们不能随机化。代码如下:



import csv
import random

with open ("my_file") as f:
  l=list(csv.rader(ff))

random.shuffle(l)

with open("random.csv", "W") as f:
  csv.writer(f).writerows(f)




4 个答案:

答案 0 :(得分:2)

您可以将行读作列表,提取两列,然后将每个列拖放,然后将列压缩在一起,最后将结果写入新的csv文件:

import csv
import random

with open("input.csv") as f:
    r = csv.reader(f)
    header, l = next(r), list(r)

a = [x[0] for x in l]
random.shuffle(a)

b = [x[1] for x in l]
random.shuffle(b)

with open("random.csv", "wb") as f:
    csv.writer(f).writerows([header] + zip(a, b))

答案 1 :(得分:0)

HBS,你的代码的问题是它试图改变行顺序而不是单独的列。

您可以将每个列读取到单独的列表中,然后应用shuffle,然后将两个列表组合在一起以形成行列表,然后再将它们写入输出文件。

要在读取输入文件后维护标题,请从结果列表中弹出第一个元素,然后在重排后重新组合。

以下是说明步骤的代码:

import random
import csv

# read the data into lists
with open('input.csv', 'r') as myfile:
    csvreader = csv.reader(myfile, delimiter=' ')
    list1 = []
    list2 = []
    for row in csvreader:
        a, b = row
        list1.append(a)
        list2.append(b)

# pop the first element (headers)
title1, title2 = list1.pop(0), list2.pop(0)

# shuffle the list
random.shuffle(list1)
random.shuffle(list2)

# add the titles back: 
list1 = [title1] + list1
list2 = [title2] + list2

# write rows to output file
with open('output.csv', 'w') as oput:
    output_rows = list(zip(list1, list2))
    csvwriter = csv.writer(oput, delimiter=' ')
    csvwriter.writerows(output_rows)

答案 2 :(得分:0)

也许不使用csv模块。 <怎么样

创建两个空列表,一个用于存放数字,另一个用于存放字母。

打开文件

对于文件中的每一行

分割线

将号码添加到号码列表

将字母添加到字母列表


随机播放号码列表

按顺序从每个列表中取一个项目,然后将它们写入文件

重复

内置函数zip应该有助于最后一点。

答案 3 :(得分:0)

查看csvshuf的源代码:

reader = csv.reader(args.infile, delimiter=args.delimiter, quotechar=args.quotechar)

"""Get the first row and use it as column headers"""
headers = next(reader)

"""Create a matrix of lists of columns"""
table = []
for c in range(len(headers)):
    table.append([])
for row in reader:
    for c in range(len(headers)):
        table[c].append(row[c])

cols = args.columns

for c in cols:
    args.shuffle(table[c - 1])

"""Transpose the matrix"""
table = zip(*table)

writer = csv.writer(sys.stdout, delimiter=args.output_delimiter)
writer.writerow(headers)
for row in table:
    writer.writerow(row)