使用Python随机播放csv文件的所有行

时间:2017-02-24 12:24:28

标签: python csv random shuffle

我有一个包含数据的输入csv文件:

a   15
b   14
c   20
d   45

我想生成一个不同的csv文件,该文件将包含输入文件中的完整数据行,但应该对行进行洗牌。

类似输出文件可能包含值 -

b 14
a 15
c 20
d 45 

我试过这段代码:

import random
import sys
op=open('random.csv','w+')
ip=open(sys.argv[1],'r')
data=ip.read()
data1=str(random.choices(data))
op.write(data1)
op.close()

8 个答案:

答案 0 :(得分:7)

使用pandas的另一个镜头。您可以阅读.csv文件:

df = pd.read_csv('yourfile.csv', header=None)

然后使用df.sample来改变你的行。这将返回一个随机抽样的数据帧样本。使用frac=1,您可以将整个集合视为样本:

In [18]: df
Out[18]: 
   0   1
0  a  15
1  b  14
2  c  20
3  d  45

In [19]: ds = df.sample(frac=1)

In [20]: ds
Out[20]: 
   0   1
1  b  14
3  d  45
0  a  15
2  c  20

如果你需要再次保存新的洗牌文件,你可以:

ds.to_csv('newfile.csv')

答案 1 :(得分:2)

您可以使用Python shuffle模块中的random函数。像这样:

import random
fid = open("example.txt", "r")
li = fid.readlines()
fid.close()
print(li)

random.shuffle(li)
print(li)

fid = open("shuffled_example.txt", "w")
fid.writelines(li)
fid.close()

打印命令导致:

['b 14\n', 'a 15\n', 'c 20\n', 'd 45\n']
['d 45\n', 'a 15\n', 'b 14\n', 'c 20\n']

新文件是这样的:

d 45
a 15
b 14
c 20

请确保在每个原始行的末尾都有换行符。

答案 2 :(得分:2)

随机模块中有shuffle个函数。另外,您可以readlines()来获取列表:

>>> ip=open('random.csv','r')
>>> data=ip.readlines()
>>> data
['a   15\n', 'b   14\n', 'c   20\n', 'd   45\n']
>>> from random import shuffle
>>> shuffle(data)
>>> data
['c   20\n', 'd   45\n', 'a   15\n', 'b   14\n']

如果您有标题,只需拆分数据,然后随机播放行:

>>> ip=open('random.csv','r')
>>> data=ip.readlines()
>>> header, rest=data[0], data[1:]
>>> header
'h1  h2\n'
>>> rest
['a   15\n', 'b   14\n', 'c   20\n', 'd   45\n']
>>> shuffle(rest)
>>> rest
['c   20\n', 'd   45\n', 'a   15\n', 'b   14\n']
>>> [header]+rest
['h1  h2\n', 'c   20\n', 'd   45\n', 'a   15\n', 'b   14\n']

使用with statement:

>>> with open('random.csv','r') as ip:
...   data=ip.readlines()
...
>>> header, rest=data[0], data[1:]
>>> shuffle(rest)
>>> with open('output.csv','w') as out:
...   out.write(''.join([header]+rest))
...
>>>
~$ cat output.csv
h1  h2
d   45
b   14
a   15
c   20

答案 3 :(得分:2)

我认为你应该阅读文件的实际行。

ip.readlines()

并且random.shuffle()应该用于交换线。

目前,您读取整个字符串,我认为只能从整个文件中随机获取一个字符。

答案 4 :(得分:2)

如果您的CSV包含标题,则可以使用像这样的大熊猫对其进行随机播放。

df = pd.read_csv(file_name) # avoid header=None. 
shuffled_df = df.sample(frac=1)
shuffled_df.to_csv(new_file_name, index=False)

这样,您可以避免改组标题并从新的CSV中删除索引。

答案 5 :(得分:1)

您可以使用shuf

安装shuf后,运行

shuf -o shuffled-file.csv < file-to-shuffle.csv

答案 6 :(得分:0)

我根据@cricket答案使用此代码:

from random import shuffle

with open('input.csv','r') as f1:
    data=f1.readlines()

shuffle(data[0])

with open('output.csv','w') as f2:
    f2.write(''.join([data[1:]] + data[0]))

答案 7 :(得分:0)

我就是这样过来的。

import numpy as np
import pandas as pd

df = pd.read_csv("your_csv_file.csv", header=0)    
df.reindex(np.random.permutation(df.index))