2013-03-18 2 views
1

У меня есть файл с более чем 600 000 записей. В основном он содержит:Создайте список из очень большого количества записей

user1 choice1 
user1 choice2 
user2 choice3 
user2 choice1 
. 
. 
. 
. 
user400000 choice60 

Когда я пытаюсь создать словарь по обычным методам (показано ниже), простоя перестает отвечать.

d = {} 
with open("file.txt") as f: 
    for line in f: 
     (key, val) = line.split() 
     d[key] = val 

Я хочу легко и быстро манипулировать списком/словарем из этого большого файла записей. Что было бы самым эффективным способом получить это?

+0

Это должно работать, считая, что все типы правильные. Возможно, вы печатаете 'd' - что вы не показывали - потом? Это может заблокировать IDLE. Попробуйте 'print len ​​(d)' после этого цикла. – DSM

+0

Вы хотите манипулировать каким образом? Проблема в том, что вы пытаетесь сохранить «большой файл» в переменной. Было бы лучше, если бы вы могли манипулировать одной строкой за раз, а не хранить ее. Но это может оказаться невыполнимым. – cmd

+0

@bernie: Черт, вы видели это быстрее: D –

ответ

1

pandas позволяет легко манипулировать этим количеством данных. Ваши данные представляют собой ряд меток user со связанной с ним скалярной точкой данных.

import pandas as pd 
s = pd.read_csv('file.txt', sep=' ', header=None, index_col=0, squeeze=True) 

Эта команда запрашивает pandas для загрузки данных из файла в объект Серия:

  • столбцы разделены пространством (sep=' ')
  • файл не имеет заголовка, название и первая строка уже данные (header=None)
  • Мы хотим манипулировать датой первой колонкой в ​​качестве индекса (index_col=0)
  • по умолчанию, pandas строит DataFrame объекта, но если он содержит один столбец данных, мы можем попросить Series вместо (squeeze=True)

s является Series объектом проиндексирован на этикетках пользователей теперь мы можем использовать для доступ к данным:

In [37]: s.head() 
Out[37]: 
0 
user0 104106 
user1  31024 
user2  82993 
user3 211414 
user4 499070 
Name: 1 

In [38]: s['user3'] 
Out[38]: 211414 

с 'file.txt' из 600000 линий, она занимает около секунды, чтобы загрузить s. После прямого доступа к s.