我有一个程序将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)
最有效的方法是什么?
感谢。
答案 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)
你不会得到确切的分数,但从统计学上来说,它不应该是可以接受的随机化。