Python读取XML文件(近50mb)

时间:2019-03-08 02:40:45

标签: python

我正在将XML字符串解析为CSV字符串,但是运行非常缓慢:

names.append("{} {}").format(players['firstName'], players['lastName'])

XML字符串有时会丢失几列,而我需要对其进行迭代以填充缺少的列-每行必须有92列。这就是为什么我有一些辅助功能来处理XML。

现在,我以4GB的Lambda值运行我的函数,但仍然超时:(

关于如何提高性能的任何想法?

1 个答案:

答案 0 :(得分:0)

['y_{} class_{}'.format(idx,klass) for idx,forest in enumerate(multi_target_forest.estimators_) \ for klass in forest.classes_] #output: ['y_0 class_0', 'y_0 class_1', 'y_0 class_2', 'y_0 class_3', 'y_1 class_0', 'y_1 class_1', 'y_1 class_2', 'y_1 class_3'] 构造ElementTree Element实例,但是normalize_row_cells只对每个实例的子代的text属性感兴趣,因此我考虑将get_cells_text更改为仅返回文本。另外,它正在执行复制并调用normalize_row_cells:将元素插入列表的中间可能会很昂贵,因为插入点之后的每个元素都必须移动。

类似的事情(未经测试的代码)可以避免进行复制和插入,而仅返回所需的文本,从而使list.insert变得多余。

get_cells_text

如果您可以将单元格与其标头名称进行匹配,那么使用标准库中的csv.DictWriter可能会更好(您需要进行分析以确保安全)。

def normalize_row_cells(row):
    cells = list(row)
    updated_cells = []
    pos = 1
    for _ in range(0, 92):
        elm = cells[pos - 1]
        strIndexAttr = elm.get(INDEX_COLUMN)
        index = int(strIndexAttr) if strIndexAttr else pos
        if index == pos:
            updated_cells.append(elm[0].text)
            pos += 1
        else:
            update_cells.append("")        
    return updated_cells