【问题标题】:Using Python to randomize csv file使用 Python 随机化 csv 文件
【发布时间】:2015-03-26 00:32:09
【问题描述】:

我有一个包含 2 列的 csv 文件:

1 A
2 B
3 C
4 D

我的目标是使用 Python 打开文件,读取它,随机化两个列表的顺序(即 1 与 C 具有同一行,2 与 D 等),然后保存新的随机列表在不同的 csv 文件中。

我阅读了更多关于 writer 的内容,但还不确定如何使用这些功能。

唯一的问题是我需要保持列标题完整,它们不能随机化。代码如下:

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)

【问题讨论】:

  • 您已经很好地将问题分解为各个步骤。尝试将每个步骤转换为代码,如果您遇到特定问题,请向我们展示您的代码并准确说明您遇到的问题。
  • 好吧,我找到了其他人使用的代码,并尝试根据我的需要对其进行调整,但效果不佳。现在我正在尝试自己做,到目前为止我想出的就是这个(将在上面编辑我的问题)

标签: python csv shuffle


【解决方案1】:

您可以将行读取为列表,提取两列,然后将每一列打乱,然后将列压缩在一起,最后将结果写入新的 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))

【讨论】:

  • 我不认为这符合 OP 的要求,他们想随机配对元素,而不仅仅是打乱行的顺序。
  • 只是出于好奇,python 中洗牌和随机化的实际区别是什么?
  • 嗨@JuniorCompressor - 感谢您的帖子。此代码返回:“IndexError: list index out of range”
  • 抱歉,不确定分隔符是什么。我总共有 13 行(包括标题)和 2 列。
  • 太棒了!最后一个问题 - 新的 csv 在每一行之间都有一个空行。有没有办法确保所有行都被填充而没有空格?
【解决方案2】:

HBS,您的代码的问题在于它试图打乱行顺序,而不是单独打乱列。

您可以将每一列读入单独的列表,然后应用 shuffle,然后将两个列表组合在一起以形成行列表,然后再将它们写入输出文件。

为了保持标题,在您读取输入文件后,将第一个元素从结果列表中弹出,然后在洗牌后重新组合。

以下是说明步骤的代码:

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)

【讨论】:

    【解决方案3】:

    可能不使用csv 模块。怎么样

    创建两个空列表,一个用于保存数字,另一个用于保存字母。

    打开文件,

    文件的每一行

    分割线

    将号码添加到号码列表中

    将字母添加到字母列表中


    随机播放号码列表

    按顺序从每个列表中取出一项,并将它们写入文件

    重复

    内置函数zip 应该对最后一点有所帮助。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-24
        • 2017-07-15
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 2017-08-30
        • 2016-11-09
        • 2023-03-04
        相关资源
        最近更新 更多