У меня очень большой файл csv (8GB +). Я хочу использовать данные в этом csv-файле для обучения, тестирования и наборов перекрестной проверки. Как я случайно прочитал этот CSV-файл на нескольких фреймах данных? Я использую Python 3.читает csv в несколько информационных кадров
ответ
Критическая точка случайно. CSV отдельные записи по разрыву строки. Если вы не можете узнать длину записей, прежде чем вы их прочитали, случайный должен быть сделан путем трюка, а не полностью случайным.
import os, random
FILENAME = "foo.txt"
MAX_ROW = 200
#Max length of one row possible
filsize = os.stat(FILENAME).st_size
fo = open(FILENAME, "r+")
block_count = filesize/MAX_ROW
#Count how many blocks are there
randomkeys = [[random.random() for i in range(block_count)] for j in range(block_count)]
#Randomize those keys
for seeknum in randomkeys:
fo.seek(0, seeknum*MAX_ROW)
findline = fo.readline()
# to find next line
line = fo.readline()
#handling line here
Я думаю, что 'block_count = filesize/MAX_ROW' является проблемой, потому что строки могут иметь разный размер. Вы имеете в виду, что 'block_size' на самом деле' block_count'? – xirururu
Вы правы, спасибо за исправление. О разных размерах: seeknum - это случайная точка входа, фактическая строка после следующего EOL – Shintiger
Граф на первый, сколько строк в файле CSV. (Есть много способов сделать это, StackOverflow уже много взаимосвязанных вопросов.) Затем создайте список с
indices = range(num_lines)
random выбирает набор индексов строк. Например, вы можете использовать
your_selected_lineindices = random.sample(indices, 10000)
.использовать следующий код:
with open("file") as fp: for i, line in enumerate(fp): if i in your_selected_lineindices: do_something_with(line)
Этот код не будет переполнения памяти. Оригинальный код отсюда: https://stackoverflow.com/a/2081880/3279996
Вы хотите разделить его ~ 50/50 или прочитать примерную совокупность N от него до другого набора и так далее? что ты уже испробовал? –
@ IljaEverilä Я хочу разделить его на два набора (набор для обучения и тестирования для алгоритма машинного обучения). Нет фиксированного отношения, но обычно предпочтительнее 80:20. – Amb
Есть ли у вас какой-либо код, для которого определенная часть проблематична? В его нынешнем виде ваш вопрос слишком широк. –