使用 Python 随机化 csv 文件

Using Python to randomize csv file

我有一个包含 2 列的 csv 文件:

1 A
2 B
3 C
4 D

我的目标是使用 Python 打开文件,读取它,随机化两个列表的顺序(即 1 与 C 位于同一行,2 与 D 等),以及然后将新的随机列表保存在不同的 csv 文件中。

我阅读了更多关于 writer 的资料,但我还不确定如何使用这些功能。

唯一的问题是我需要保持列 headers 完整,它们不能随机化。代码如下:

import csv
import random

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

random.shuffle(l)

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

您可以将行读取为列表,提取两列,然后将每一列打乱,然后将列压缩在一起,最后将结果写入新的 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))

HBS,您的代码存在问题,它试图打乱行顺序,而不是单独打乱列。

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

为了维护 headers,在读取输入文件后,将第一个元素从结果列表中弹出,然后在洗牌后重新组合。

下面是说明步骤的代码:

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)

可能不会使用 csv 模块。怎么样

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

打开文件,

对于文件中的每一行

分割线

将号码添加到号码列表

将字母添加到字母列表


随机排列数字列表

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

重复

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

看看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)