Python更快的方式来读取固定长度字段将文件形成字典

时间:2010-05-06 05:44:37

标签: python file dictionary performance

我有一个名称和地址的文件如下(示例行)

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 个答案:

答案 0 :(得分:2)

struct.unpack()s说明符结合使用,会使字符串分裂得比切片更快。

答案 1 :(得分:1)

修改:刚看到下面有关逗号的评论。在文件读取方面,下面的方法很快,但它是基于分隔符的,并且在您的情况下会失败。不过,它在其他情况下很有用。

如果您想快速阅读文件,可以使用专用模块,例如几乎标准的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数组;与词典相比,它的内存效率非常高。

如果你真的需要使用字典,你可以使用Numpy快速阅读data数组的专用循环,方式与你所做的类似。

答案 2 :(得分:0)

如果您希望加快速度,可以直接将field_start+field_length存储在self.field_list中,而不是存储field_length

此外,if field_data != ''可以更简单地写为if field_data(如果这样可以加快速度,那么它是微不足道的。)

我会说,与标准Python可以做的相比,你的方法非常快(即,不使用非标准的专用模块)。

答案 3 :(得分:0)

如果您的行包含示例中的逗号,则可以使用line.split(',')而不是多个切片。这可能会更快。

答案 4 :(得分:0)

您需要使用csv模块。

它不仅可以处理csv,还可以处理任何类似csv的格式。