【问题标题】:Shuffle all rows of a csv file with Python使用 Python 随机播放 csv 文件的所有行
【发布时间】:2017-07-15 06:47:02
【问题描述】:

我有一个包含数据的输入 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()

【问题讨论】:

    标签: python csv random shuffle


    【解决方案1】:

    您可以使用 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
    

    只需确保在每条原始行的末尾都有一个换行符。

    【讨论】:

    • 试过这个,得到错误'None Type,object is not 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.close()
    • @RoshVerma 我在发布之前已经运行了代码,所以我猜测它在您的数据中导致了问题。尝试同时打印datadata1 并告诉我结果。
    • 是的,得到了​​错误,它在我的代码中。非常感谢你的帮助。它终于奏效了。 :)
    • 但 CSV 文件可以在配额中包含行尾。你不能只是洗牌,你需要洗牌 CSV 行......
    【解决方案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
    

    【讨论】:

    • 试过这个,得到错误'None Type,object is not 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.close()
    • @RoshVerma shuffle 就地修改列表。无需做data1=shuffle(data)。你也应该检查with statement
    • 该死!砰的一声。伙计,你很好。有效。我已经尝试了 2 天。非常感谢。
    • 对不起上一个链接:with statement我已经更新了我的答案。希望对您有所帮助。
    • header, rest=data[0], data[1:] 可以写成header=data[0] + rest=data[1:],所以 header 是一个包含数据列表第一个元素的变量:所以它是一个字符串,而 rest 是一个包含所有数据,第一个元素除外。
    【解决方案3】:

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

    ip.readlines()
    

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

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

    【讨论】:

      【解决方案4】:

      使用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')
      

      【讨论】:

        【解决方案5】:

        您可以使用shuf

        安装shuf后,运行

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

        【讨论】:

        【解决方案6】:

        如果您的 CSV 包含标题,那么您可以像这样使用 pandas 对其进行随机播放。

        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 中删除索引。

        【讨论】:

          【解决方案7】:

          我正在根据@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]))
          

          【讨论】:

            【解决方案8】:

            我是这样走的。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-28
              • 2019-08-05
              • 2016-12-29
              • 1970-01-01
              相关资源
              最近更新 更多