2017-02-24 49 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')