2013-12-18 3 views
3

Я ищу эффективный способ загрузки огромного файла с данными.Python разбор огромного файла

Файл имеет следующий формат

1\tword1\tdata

2\tword2\tdata

3\tword3\tdata

\r\n

1\tword4\tdata

2\tword2\tdata

\r\n

, где \r\n определяет конец предложений, которые состоят из слов.

Я заинтересован в загрузке файла и сохранение структуры, то есть я хочу обратиться к приговорить и к слову в предложении, в общем, как результат я хочу получить что-то вроде этого

data = [sentence1, sentence2,... ] 

где sentence = [word1,word2,...]

Загрузка файла по строкам занимает много времени, загрузка файлов партиями намного эффективнее, однако я не знаю, как анализировать и разделить данные на предложения.

В настоящее время я использую следующий код

def loadf(filename): 
    n = 100000 
    data = [] 
    with open(filename) as f: 
     while True: 
      next_n_lines = list(islice(f, n)) 
      if not next_n_lines: 
       break 
      data.extend([line.strip().split('\t') for line in next_n_lines]) 

С помощью этого кода я не знаю, как разделить данные предложения, кроме того, я подозреваю, что на самом деле не extend расширить текущий список, но создать новый один и переназначить, потому что он очень медленный.

Буду признателен за любую помощь.

+3

«строка файл Загрузка по линии займет много времени, загрузка файла партий гораздо более эффективных» - Вы уверены в этом? Вы на самом деле это время? Python читает файл в кусках для подачи итератора строки, поэтому вам не нужно его обрабатывать самостоятельно. – user2357112

+0

Каков размер файла примерно? –

+0

@TimZimmermann, ~ 700Mb – user16168

ответ

4

Как насчет:

import csv 
from itertools import groupby 

with open(yourfile) as fin: 
    tabin = csv.reader(fin, delimiter='\t') 
    sentences = [[el[1] for el in g] for k, g in groupby(tabin, bool) if k] 
+0

Удивительно, это занимает всего несколько секунд, спасибо вам большое! – user16168

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