Python более быстрый способ чтения полей фиксированной длины из файла в словарь - PullRequest
0 голосов
/ 06 мая 2010

У меня есть файл имен и адресов следующим образом (пример строки)

OSCAR    ,CANNONS      ,8     ,STIEGLITZ CIRCUIT

И я хочу прочитать это в словаре имени и значения. Здесь self.field_list - это список имени, длины и начальной точки фиксированных полей в файле. Какие есть способы ускорить этот метод? (python 2.6)

def line_to_dictionary(self, file_line,rec_num):
  file_line = file_line.lower()  # Make it all lowercase

  return_rec = {}  # Return record as a dictionary

  for (field_start, field_length, field_name) in self.field_list:

    field_data = file_line[field_start:field_start+field_length]

    if self.strip_fields == True:  # Strip off white spaces first
      field_data = field_data.strip()

    if field_data != '':  # Only add non-empty fields to dictionary
      return_rec[field_name] = field_data

  # Set hidden fields
  #
  return_rec['_rec_num_'] = rec_num
  return_rec['_dataset_name_'] = self.name
  return return_rec      

Ответы [ 5 ]

2 голосов
/ 06 мая 2010

struct.unpack() в сочетании с s спецификаторами с длинами разрывает строку быстрее, чем разрезание.

1 голос
/ 06 мая 2010

Редактировать : Только что увидел ваше замечание о запятых ниже. Приведенный ниже подход является быстрым, когда дело доходит до чтения файла, но он основан на разделителях, и в вашем случае он потерпит неудачу. Однако в других случаях это полезно.

Если вы хотите быстро прочитать файл, вы можете использовать специальный модуль, например, почти стандартный Numpy :

data = numpy.loadtxt('file_name.txt', dtype=('S10', 'S8'), delimiter=',')   # dtype must be adapted to your column sizes

loadtxt() также позволяет обрабатывать поля на лету (с аргументом converters). Numpy также позволяет вам давать имена столбцам (см. doc ), так что вы можете сделать:

data['name'][42]  # Name # 42

Полученная структура похожа на массив Excel; по сравнению со словарем оно весьма эффективно по памяти.

Если вам действительно нужно использовать словарь, вы можете использовать выделенный цикл над массивом data, быстро читаемый Numpy, способом, аналогичным тому, что вы сделали.

0 голосов
/ 06 мая 2010

Вы захотите использовать модуль csv .

Он обрабатывает не только CSV, но и любой CSV-подобный формат, который, по-видимому, ваш.

0 голосов
/ 06 мая 2010

Если в ваших строках есть запятые, как в примере, вы можете использовать line.split (',') вместо нескольких слайсов. Это может оказаться быстрее.

0 голосов
/ 06 мая 2010

Если вы хотите ускорить работу, вы также можете сохранить field_start+field_length непосредственно в self.field_list вместо хранения field_length.

Кроме того, if field_data != '' можно более просто записать как if field_data (если это даёт какое-то ускорение, оно все же маргинальное).

Я бы сказал, что ваш метод довольно быстрый по сравнению с тем, что может делать стандартный Python (т.е. без использования нестандартных выделенных модулей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...