拍摄CSV样本?

时间:2017-03-30 12:54:42

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

我有一个程序将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)

最有效的方法是什么?

感谢。

2 个答案:

答案 0 :(得分:0)

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

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行的列表,然后您可以使用这些行或将其写入另一个文件。

答案 1 :(得分:0)

如果你想要一个具有确定行数的样本,正如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)

你不会得到确切的分数,但从统计学上来说,它不应该是可以接受的随机化。