gpt4 book ai didi

python - 我如何改进这个Python脚本来替换dbf文件中的记录?

转载 作者:行者123 更新时间:2023-11-30 22:15:55 25 4
gpt4 key购买 nike

我有一个大约 900 万条记录、大小为 2.5 GB 的 dbf 文件。用于存储大约 10 个不同字符串中的 1 个的 80 大小的字符字段占用了大量空间。为了节省文件大小,我想用整数字段替换字符字段,并在稍后阶段使用关系数据库来获取完整的字符字段(如果需要)。

目前我有以下使用 dbf 库 ( http://pythonhosted.org/dbf/ ) 的 Python 脚本。该脚本似乎可以正常工作(在较小的 dbf 文件上进行测试),但当我尝试使用完整的 dbf 文件运行它时,它运行了几个小时。

import dbf

tabel = dbf.Db3Table('dataset.dbf')
tabel.open()

with tabel:
tabel.add_fields('newfield N(2, 0)')
for record in tabel:
if record.oldfield == 'string_a ':
dbf.write(record, newfield=1)
elif record.oldfield == 'string_b ':
dbf.write(record, newfield=2)
elif record.oldfield == 'string_c ':
dbf.write(record, newfield=3)
elif record.oldfield == 'string_d ':
dbf.write(record, newfield=4)
elif record.oldfield == 'string_e ':
dbf.write(record, newfield=5)
elif record.oldfield == 'string_f ':
dbf.write(record, newfield=6)
elif record.oldfield == 'string_g ':
dbf.write(record, newfield=7)
elif record.oldfield == 'string_h ':
dbf.write(record, newfield=8)
elif record.oldfield == 'string_i ':
dbf.write(record, newfield=9)
elif record.oldfield == 'string_j ':
dbf.write(record, newfield=10)
else:
dbf.write(record, newfield=0)

dbf.delete_fields('dataset.dbf', 'oldfield')

正如您从代码中看到的,我对 Python 和 dbf 库都是新手。可以让这个脚本运行得更高效吗?

最佳答案

添加和删除字段都会首先为您的 2.5GB 文件创建备份副本。

最好的办法是创建一个与原始结构相同的新 dbf,但这两个字段除外;然后在复制每条记录时进行更改。像这样的东西:

# lightly untested

old_table = dbf.Table('old_table.dbf')
structure = old_table.structure()
old_field_index = structure.index('oldfield')
structure = structure[:old_field_index] + structure[old_field_index+1:]
structure.append('newfield N(2,0)')
new_table = dbf.Table('new_name_here.dbf', structure)

with dbf.Tables(old_table, new_table):
for rec in old_table:
rec = list(rec)
old_value = rec.pop(old_field_index)
rec.append(<transform old_value into new_value>)
new_table.append(tuple(rec))

关于python - 我如何改进这个Python脚本来替换dbf文件中的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com