使用 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)
我有一个包含 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)