gpt4 book ai didi

python - 在 python 中使用 dbf 库读取更改

转载 作者:行者123 更新时间:2023-11-29 02:58:40 24 4
gpt4 key购买 nike

我正在尝试制作一个程序,在 dbf 文件中进行更改,然后上传它们。我已经得到它来读取 dbf 文件并将它们上传到 mysql 数据库,但它需要 50 分钟的上传时间。我试图让它只上传已更改的字段。我遇到的问题是,我似乎需要关闭并重新打开 dbf 文件。如果有人在执行此操作时进行了更改,它不会注意到发生了更改。

是否有更好/正确的方法:

import time
import dbf
import MySQLdb
import os

source_path = r"\\path\to\file"
file_name = "\\test.Dbf"

print "Found Source DBF"

source = dbf.Table(source_path + file_name)
source.open()

print "Opened DBF"

updated = list(source)
print "Copied Source"

db = MySQLdb.connect(host = "myHost.com", port=3306, user = "user", passwd = "pass", db = "database")
cur = db.cursor()
print "Connected to database"

try:
cur.execute("DROP TABLE IF EXISTS dbftomysql")
except:
db.rollback()

print "Dropped old table"

sql = """CREATE TABLE table(
col1 VARCHAR(200) NOT NULL,
col2 VARCHAR(200),
col3 VARCHAR(200),
col4 NUMERIC(15,2),
col5 VARCHAR(200) )"""

cur.execute(sql)

print "Created new table"

for i, s in zip(source, updated):
query = """INSERT table SET col1 = %s, col2 = %s, col3 = %s, col4 = %s, col5 = %s"""
values = (i["col1"], i ["col2 "], i["col3"], i["col4"], i["col5"])
cur.execute(query, values)
db.commit()
print i["col1"], i ["col2 "], i["col3"], i["col4"], i["col5"]
print "First Upload Completed"

while True:
for i, s in zip(source, updated):
if i["col1"] != s["col1"]:
print i["col1"] + " col1Updated"
query = """UPDATE table SET col1= %s WHERE col1= %s"""
values = (i["col1"], s["col1"])
try:
cur.execute(query, values)
db.commit()
except:
db.rollback()
print "No connection to database"

if i["col2"] != s["col2"]:
print i["col2"] + " col2 Updated for " + i["col1"]
query = """UPDATE table SET col2 = %s WHERE col1= %s OR col1= %s"""
values = (i["col2"], i["col1"], s["col1"])
try:
cur.execute(query, values)
db.commit()
except:
db.rollback()
print "No connection to database"
#ect

updated = list(source)
source.close()
source.open()
time.sleep(0.2)

最佳答案

dbf 库只会从内存中不存在的 dbf 文件中获取记录;当你做的时候

updated = list(source)

您实际上卡住了所有行,因为 updated 是记录列表(不是 list 列表或 tuple 列表s; 这意味着当您稍后尝试比较 sourceupdated 时,您正在比较相同的数据。

为了使 updated 成为与 source 分开的实体,请尝试

updated = [tuple(row) for row in source]

这会给你一个元组列表,或者

updated = [scatter(row, dict) for row in source]

这将为您提供一个字典列表,这是您进一步向下的字段比较代码所需要的。

关于python - 在 python 中使用 dbf 库读取更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27277230/

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