代码之家  ›  专栏  ›  技术社区  ›  Martlark

用python更快的方法将固定长度的字段从一个文件读取到字典中

  •  0
  • Martlark  · 技术社区  · 15 年前

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

    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 回复  |  直到 12 年前
        1
  •  0
  •   Eric O. Lebigot    12 年前

    如果你想加快速度,你也可以储存 field_start+field_length 直接在self.field_列表中,而不是存储 field_length .

    也, if field_data != '' 可以简单地写为 if field_data (如果这会使速度加快,那么它是边缘的)。

    我想说,与标准的Python相比,您的方法非常快(即,不使用非标准的专用模块)。

        2
  •  2
  •   Ignacio Vazquez-Abrams    15 年前

    struct.unpack() 结合 s 具有长度的说明符将比切片更快地拆分字符串。

        3
  •  1
  •   Eric O. Lebigot    15 年前

    编辑 :刚刚看到你关于逗号的评论。下面的方法在读取文件时速度很快,但它是基于分隔符的,在您的情况下会失败。不过,它在其他情况下也很有用。

    如果你真的想快速读取文件,你可以使用一个专用的模块,比如几乎标准的 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的方式快速读取,其方式与您所做的类似。

        4
  •  0
  •   lunixbochs    15 年前

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

        5
  •  0
  •   Bite code    15 年前

    您将要使用 csv 模块。

    它不仅处理csv,而且处理任何类似csv的格式。