如何在Python中有效解析固定寬度的檔案?

Susan Sarandon
發布: 2024-10-30 18:28:31
原創
409 人瀏覽過

How can I efficiently parse fixed width files in Python?

固定寬度檔案的高效解析

固定寬度檔案由於其嚴格的結構而在解析時提出了挑戰。為了解決這個問題,可以採用多種方法來有效地從此類文件中提取資料。

使用 struct 模組

Python 標準庫的 struct 模組提供了簡潔、快速的方法解析固定寬度線的解決方案。它允許預先定義欄位寬度和資料類型,使其成為大型資料集的合適選擇。以下程式碼片段示範如何利用struct 來實現此目的:

<code class="python">import struct

fieldwidths = (2, -10, 24)
fmtstring = ' '.join('{}{}'.format(abs(fw), 'x' if fw < 0 else 's') for fw in fieldwidths)

# Convert Unicode input to bytes and the result back to Unicode string.
unpack = struct.Struct(fmtstring).unpack_from  # Alias.
parse = lambda line: tuple(s.decode() for s in unpack(line.encode()))

print('fmtstring: {!r}, record size: {} chars'.format(fmtstring, struct.calcsize(fmtstring)))

line = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n'
fields = parse(line)
print('fields: {}'.format(fields))</code>
登入後複製

具有編譯時最佳化的字串切片

字串切片是另一種解析固定的可行方法寬度文件。雖然最初效率較低,但一種稱為「編譯時最佳化」的技術可以顯著提高效能。以下程式碼實現了此最佳化:

<code class="python">def make_parser(fieldwidths):
    cuts = tuple(cut for cut in accumulate(abs(fw) for fw in fieldwidths))
    pads = tuple(fw < 0 for fw in fieldwidths)  # bool flags for padding fields
    flds = tuple(zip_longest(pads, (0,)+cuts, cuts))[:-1]  # ignore final one
    slcs = ', '.join('line[{}:{}]'.format(i, j) for pad, i, j in flds if not pad)
    parse = eval('lambda line: ({})\n'.format(slcs))  # Create and compile source code.
    # Optional informational function attributes.
    parse.size = sum(abs(fw) for fw in fieldwidths)
    parse.fmtstring = ' '.join('{}{}'.format(abs(fw), 'x' if fw < 0 else 's')
                                                for fw in fieldwidths)
    return parse</code>
登入後複製

這種最佳化方法為解析固定寬度檔案提供了效率和可讀性。

以上是如何在Python中有效解析固定寬度的檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!