【发布时间】:2021-12-10 18:29:01
【问题描述】:
我有几千个 .DBF 文件需要更新。这些文件目前有一个包含一列或两列(名称、地理路径)或(名称)的标题,以及一行数据。
更新包括:
- 如果存在地理路径列,则删除它
- 添加其他列
- 用制表符分隔文件中的数据填充(仅)数据行中的新列。
我无法添加列并填充它们。 (错误见下文)
在高层次上,我的意图是:
遍历源文件中的记录 对于每条记录: 使用记录中的“文件名”打开相应的 .dbf 文件(在当前目录中) 添加其他列标题 使用源文件中当前记录的数据填充新列
源文件 - 制表符分隔,列: GUID C(24) 场地名称 C(100) 网络 C(50) 地址 1 C(75) C市(50) SVID 浮点数 文件名(例如:test1.dbf)
这适用于第 1 步:
import dbf
file = open('testing.tsv')
for line in file: #'GUID\tVenueName\tNetworkName\tAddress1\tCity\tSalesVenueID\n'
fields = line.strip().split('\t')
res=[fields[0], fields[1], fields[2], fields[3], fields[4],fields[5], fields[6]]
print("the elements of the list are : " + str(res))
#fields[0]=Guid, fields[1]=VenueName, fields[2]=NetworkName, fields[3] = Address1, fields[4]=City, fields[5]=SalesVenueID, fields[6]=FilePath
filename=fields[6]
print("filename is: " + str(filename))
if not str(filename)=='FileName':
with dbf.Table(str(filename)) as db:
try:
db.delete_fields('geojson')
except Exception:
pass
db.pack()
对于第 2 步和第 3 步,这个稍有不同的 sn-p 写入列,但错误为 'data to append must be a tuple, dict, record, or template;在 table.append 步骤中不是
import dbf
file = open('testing.tsv')
for line in file: #'GUID\tVenueName\tNetworkName\tAddress1\tCity\tSalesVenueID\n'
fields = line.strip().split('\t')
res=[fields[0], fields[1], fields[2], fields[3], fields[4],fields[5], fields[6]]
print("the elements of the list are : " + str(res))
#fields[0]=Guid, fields[1]=VenueName, fields[2]=NetworkName, fields[3] = Address1, fields[4]=City, fields[5]=SalesVenueID, fields[6]=FilePath
currentfilename=str(fields[6])
print("filename is: " + currentfilename)
if not currentfilename=='FileName': #Ignore header row
# create an in-memory table
table = dbf.Table(
filename=currentfilename,
field_specs='GUID C(24); VenueName C(100); Network C(50) ; Address1 C(75); City C(50); SVID C(20)',
on_disk=True,
)
table.open(dbf.READ_WRITE)
# add some records to it
for datum in (
(tuple(res))
):
table.append(datum)
# iterate over the table, and print the records
for record in table:
print(record)
print('--------')
table.pack()
查看屏幕截图以了解变量 variable 'res' 中的内容
已编辑以包含最终(工作)代码:
import dbf
file = open('SourceFile.tsv')
for line in file:
#'GUID\tVenueName\tNetworkName\tAddress1\tCity\tSalesVenueID\n'
fields = line.strip().split('\t')
res=[fields[0], fields[1], fields[2], fields[3], fields[4]]
print("the elements of the list are : " + str(res))
#fields[0]=VenueName, fields[1]=NetworkName, fields[2] = Address1,
fields[3]=City, fields[4]=SalesVenueID, fields[5]=FilePath
currentfilename=str(fields[5])
print("filename is: " + currentfilename)
if not currentfilename=='FileName': #Ignore header row
# create or open existing file
table = dbf.Table(
filename=currentfilename,
field_specs='VenueName C(100); Network C(50) ; Address1
C(75); City C(50); SVID C(20)',
on_disk=True,
)
table.open(dbf.READ_WRITE)
# Update record
VenueName=fields[1]
try:
table.append(tuple(res))
except Exception as e:
print('--------')
print('--------')
print('Error on VenueName: ' + VenueName )
print(e)
pass
# iterate over the table, and print the records
for record in table:
print(record)
print('--------')
table.pack()
【问题讨论】: