【问题标题】:Taking a sample of a CSV?采集 CSV 样本?
【发布时间】:2017-03-30 12:54:41
【问题描述】:

我有一个程序将 CSV 转换为有效的 JSON 文件。

我想将其更改为获取我的 CSV 文件的一个随机子集(作为它的 50k 行)并从中生成一个 JSON。到目前为止,这是我的代码 -

import csv
import json

csvfile = open('C:\\Users\\ADMIN\\Desktop\\CSV_1.csv', 'r')
jsonfile = open('C:\\Users\\ADMIN\\Desktop\\Testing\\file.json', 'w')

with open('C:\\Users\\ADMIN\\Desktop\\CSV_1.csv') as f:
    reader = csv.DictReader(f)
    rows = list(reader)

with open('C:\\Users\\ADMIN\\Desktop\\Testing\\file.json', 'w') as f:
    json.dump(rows, f)

最有效的方法是什么?

谢谢。

【问题讨论】:

    标签: python json python-3.x csv random


    【解决方案1】:

    您可以将random.sample(lst, n) 应用于行列表以从list of rows 中随机获取n 的行数,如下所示:

    import random
    rows_subset = random.sample(rows, 50)
    
    # Then later in the code, dump the json and write it to the other file.
    with open('gen.json', 'w') as f:
        f.write(json.dumps(rows_subset))
    

    这将为您提供50 行列表,然后您可以使用这些行或将其写入另一个文件。

    【讨论】:

      【解决方案2】:

      如果您想要一个具有确定行数的示例,如 Satish Garg 所建议的,那么内置工具是 random.sample。 问题是文件对象确实是可迭代的,但不是序列:没有len 方法,没有直接索引。

      如果您有足够的内存并且 csv 文件可以轻松放入,更简单的方法是使用 reader.readlines() 将所有内容加载到列表中,然后使用 random.sample 获取子集。或者,您可以读取文件一次以获取其长度,选择行号来组成示例:

      line_numbers_to_keep = sorted(random.sample(range(file_length), size_of_sample))
      

      然后您可以使用以下命令构建示例:

      sample = []
      index = 0
      for i, row in enumerate(csv_reader):
          if i >= line_numbers_to_keep[index]:
              sample.append(row)
              index += 1
      

      如果您想要原始文件的确定部分的样本,例如 1/n,一个简单的技巧是跳过 [0;2*n-1) 范围内的随机数

      next = random.randrange(2*n-1)
      sample = []
      for i, row in enumerate(csv_reader):
          if i >= next:
              sample.append(row)
              next = i + random.randrange(2*n-1)
      

      您不会得到确切的分数,但从统计上看,它应该不会太远并且具有可接受的随机性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-12
        • 2021-04-15
        相关资源
        最近更新 更多