2017-02-24 21 views
2

我有一个数据的输入CSV文件:洗牌csv文件中的所有行与Python

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

回答

2

您可以从Python的random模块使用shuffle功能。就像这样:

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 

只要确保你在每年年底有一个换行符你的原始线条。

+0

想这一点,得到错误“无类型,对象不iterable'code-ip = open(sys.argv [1],'r')data = ip.readlines()ip.close()data1 = shuffle(data)op = open('random.csv','w +') )op.writelines(data1)op。关闭() –

+0

@RoshVerma我发布之前运行的代码,所以我猜它是在你的数据导致问题的东西。试着打印'data'和'data1'并告诉我结果。 – armatita

+0

是的,得到了​​错误,它在我的代码中。非常感谢你的帮助。它终于奏效了。 :) –

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语句使用

>>> 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 
+0

试过,得到错误 '无类型,对象不是可迭代' 代码 - IP =开放(sys.argv中[1], 'R') 数据= ip.readlines() ip.close() DATA1 = shuffle(data) op = open('random.csv','w +') op.writelines(data1) op.close() –

+0

@RoshVerma shuffle将位置更改为列表。不需要执行'data1 = shuffle(data)'。你也应该检查[与声明](http://codegolf.stackexchange.com/)。 – fredtantini

+0

该死!砰一声。你是个好人。有效。我一直在试2天。谢谢。 –

2

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

ip.readlines() 

random.shuffle()应该用来换行。

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

2

使用pandas的另一拍摄。使用df.sample洗牌你行

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

,然后:您可以读取你的.csv文件。这将返回您的数据帧随机行随机样本。使用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')