我有一个名称和地址的文件如下(示例行)
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
答案 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的格式。