【问题标题】:Python faster way to read fixed length fields form a file into dictionaryPython更快的方法将固定长度字段从文件读取到字典中
【发布时间】:2010-05-06 05:44:37
【问题描述】:

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

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      

【问题讨论】:

  • 你不能像普通的 csv 文件一样处理它吗?也许在值上运行 strip() 。在撰写本文时这些值是固定长度是否重要?
  • 我已经阅读了我得到改进的代码,看起来固定长度字段重叠,所以例如你有 (name:start:length) fname:1:10 和fname_initial:1:1 我很沮丧!

标签: python file dictionary performance


【解决方案1】:

struct.unpack() 与带有长度的 s 说明符结合使用会比切片更快地撕开字符串。

【讨论】:

  • 试过了,但不确定如何处理重叠字段
  • ... 重叠字段?谁想出了那个?
【解决方案2】:

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

如果你想真正快速读取文件,可以使用专用模块,比如几乎标准的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 数组上的专用循环,方式类似于您所做的。

【讨论】:

    【解决方案3】:

    如果你想获得一些加速,你也可以直接将field_start+field_length存储在self.field_list中,而不是存储field_length

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

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

    【讨论】:

      【解决方案4】:

      如果您的行包含与示例类似的逗号,则可以使用 line.split(',') 代替多个切片。这可能会更快。

      【讨论】:

        【解决方案5】:

        您需要使用csv 模块。

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

        【讨论】:

        • 不幸的是,“类似 CSV”可能还不够。字段可能包含嵌入的逗号,此时csvline.split(',') 将严重失败。
        猜你喜欢
        • 2014-09-03
        • 1970-01-01
        • 2018-06-22
        • 2011-03-13
        • 2012-02-29
        • 1970-01-01
        • 2020-09-22
        相关资源
        最近更新 更多