2016-05-03 6 views
1

У меня очень большой файл csv (8GB +). Я хочу использовать данные в этом csv-файле для обучения, тестирования и наборов перекрестной проверки. Как я случайно прочитал этот CSV-файл на нескольких фреймах данных? Я использую Python 3.читает csv в несколько информационных кадров

+0

Вы хотите разделить его ~ 50/50 или прочитать примерную совокупность N от него до другого набора и так далее? что ты уже испробовал? –

+0

@ IljaEverilä Я хочу разделить его на два набора (набор для обучения и тестирования для алгоритма машинного обучения). Нет фиксированного отношения, но обычно предпочтительнее 80:20. – Amb

+0

Есть ли у вас какой-либо код, для которого определенная часть проблематична? В его нынешнем виде ваш вопрос слишком широк. –

ответ

1

Критическая точка случайно. 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 
+0

Я думаю, что 'block_count = filesize/MAX_ROW' является проблемой, потому что строки могут иметь разный размер. Вы имеете в виду, что 'block_size' на самом деле' block_count'? – xirururu

+0

Вы правы, спасибо за исправление. О разных размерах: seeknum - это случайная точка входа, фактическая строка после следующего EOL – Shintiger

1
  1. Граф на первый, сколько строк в файле CSV. (Есть много способов сделать это, StackOverflow уже много взаимосвязанных вопросов.) Затем создайте список с indices = range(num_lines)

  2. random выбирает набор индексов строк. Например, вы можете использовать your_selected_lineindices = random.sample(indices, 10000).

  3. использовать следующий код:

    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

 Смежные вопросы

  • Нет связанных вопросов^_^