python - 我的函数没有返回变量,我不知道为什么
问题描述
我正在尝试创建函数然后调用它,但是其中一个函数不起作用。它不返回变量。我的代码分为 2 个文件,名为 libar2 的库和程序。函数 sort 不返回任何内容。错误是:NameError:未定义名称“to_write”。应该是字典。
这是程序:
list1 = []
list2 = []
list3 = []
#List indexu
indexus = ["Č.refer.dokladu", "Číslo dokladu", "Řádka ref.dok.","Účetní řádka"]
#List všech sloupců
listus = ["TypRefDokl","Č.refer.dokladu","Číslo dokladu","Řádka ref.dok.", "Účetní řádka","ÚčOkOdesíl", "Obchodní proces", "Logický systém", "Prodejní organizace", "Ledger", "Nositel nákladů", "Klíč měny účet.okruhu", "Prodej.doklad", "Druh pohybu MM", "Fiskální rok", "Druh faktury", "V měně profit centra", "Ref.org.jednotka", "Typ ukazatele", "Skupina původu", "Označení nemovitosti", "Podčíslo", "Druh dokladu", "Množství", "Refer.fiskální rok", "Druh výkonu", "ÚčOk příjemce", "Obor", "Cesta odbytu", "Čas pořízení dat", "Datum dokl.", "Elimin.profit center", "Partner.PrCtr", "Referenční operace", "Objekt původu", "Provoz.ekon.operace", "Zakázka odběratele", "Klíč firemní měny PrCtr", "Pol.zakázky odběr.", "Č.postupu k operacím", "Klíč měny trans.", "Verze", "Investiční majetek", "Odbytový doklad", "Dokl.byl stornován", "Text", "TypDokl", "Závod", "Třída objektu", "Datum účtování", "Nákladový okruh", "Polož.nák.dokladu", "Okruh ocenění", "Číslo reprezentativ.materiálu", "Pol.odbyt.dokladu", "Druh pohybu", "Verze rozlišení", "Druh ocenění", "Pol.prod.dokladu", "Datum pořízení", "Oblast hosp.výsl.", "V měně transakce", "Druh záznamu", "Prodejní kancelář", "Dodavatel", "Statist.ukazatel", "Odpisová oblast", "Partner.společnost", "Číslo účtu", "Klíč nemovitostí", "Zakázka", "Odběratel", "Znak Má dáti/Dal", "Dokl.je stornov.dokl.", "Nákupní doklad", "Skupina prodeje", "Druh dokl.", "Nákl.středisko", "Automatický znak", "Funkční obl.partnera", "Účetní období", "Funkční oblast", "Prvek SPP", "Materiál", "Datum valuty", "Dr.pohybu na IM", "Pracovní úsek", "Oper.ref.dokl.", "Profit centrum", "V měně účetního okruhu", "Dr.objektu příjemce", "Text účtů", "Jméno uživatele", "Zákl.měrná jednotka"]
columnnames = []
from Libar2 import (premade_table, sort, write, find_unknown)
import openpyxl
from json import load
import sqlite3
with open("cfg.json","r") as cfgfile:
cfg = load(cfgfile)
dodavatele = cfg["DODAVATELE"]
con = sqlite3.connect("rozpocet.db")
cur = con.cursor()
wb = openpyxl.load_workbook(cfg["XLSX_FILE"])
sheet = wb.active
premade_table(cur)
loaded_sql = cur.execute("SELECT * FROM {0}".format(cfg["DB_NAME"]))
sort(indexus,loaded_sql,sheet)
write(cur,to_write,listus)
cur.execute('''
CREATE TABLE IF NOT EXISTS {}(
cislo INTEGER PRIMARY KEY,
JmenoDodavatele TEXT)'''.format(cfg["TAB_SUPLY"]))
find_unknown(dodavatele,cfg["DB_NAME"],cur)
cur.execute(
"""CREATE VIEW IF NOT EXISTS v1 AS
SELECT {1}.JmenoDodavatele,{0}.text,{0}.[Číslo účtu],{0}.[Text účtů],{0}.[Účetní období],{0}.[V měně profit centra] FROM {0}
LEFT JOIN {1} ON {0}.dodavatel = {1}.cislo;""".format(cfg["DB_NAME"], cfg["TAB_SUPLY"]))
con.commit()
这是图书馆:
def premade_table(cur):
cur.execute("""CREATE TABLE IF NOT EXISTS {0}(
{1} INTEGER NOT NULL,
{2} INTEGER NOT NULL,
{3} INTEGER NOT NULL,
{4} INTEGER NOT NULL,
PRIMARY KEY ({1},{2},{3},{4})
)""".format("db1", "[Č.refer.dokladu]", "[Číslo dokladu]",
"[Řádka ref.dok.]","[Účetní řádka]"))
listus = listus = ["TypRefDokl","Č.refer.dokladu","Číslo dokladu","Řádka ref.dok.", "Účetní řádka","ÚčOkOdesíl", "Obchodní proces", "Logický systém", "Prodejní organizace", "Ledger", "Nositel nákladů", "Klíč měny účet.okruhu", "Prodej.doklad", "Druh pohybu MM", "Fiskální rok", "Druh faktury", "V měně profit centra", "Ref.org.jednotka", "Typ ukazatele", "Skupina původu", "Označení nemovitosti", "Podčíslo", "Druh dokladu", "Množství", "Refer.fiskální rok", "Druh výkonu", "ÚčOk příjemce", "Obor", "Cesta odbytu", "Čas pořízení dat", "Datum dokl.", "Elimin.profit center", "Partner.PrCtr", "Referenční operace", "Objekt původu", "Provoz.ekon.operace", "Zakázka odběratele", "Klíč firemní měny PrCtr", "Pol.zakázky odběr.", "Č.postupu k operacím", "Klíč měny trans.", "Verze", "Investiční majetek", "Odbytový doklad", "Dokl.byl stornován", "Text", "TypDokl", "Závod", "Třída objektu", "Datum účtování", "Nákladový okruh", "Polož.nák.dokladu", "Okruh ocenění", "Číslo reprezentativ.materiálu", "Pol.odbyt.dokladu", "Druh pohybu", "Verze rozlišení", "Druh ocenění", "Pol.prod.dokladu", "Datum pořízení", "Oblast hosp.výsl.", "V měně transakce", "Druh záznamu", "Prodejní kancelář", "Dodavatel", "Statist.ukazatel", "Odpisová oblast", "Partner.společnost", "Číslo účtu", "Klíč nemovitostí", "Zakázka", "Odběratel", "Znak Má dáti/Dal", "Dokl.je stornov.dokl.", "Nákupní doklad", "Skupina prodeje", "Druh dokl.", "Nákl.středisko", "Automatický znak", "Funkční obl.partnera", "Účetní období", "Funkční oblast", "Prvek SPP", "Materiál", "Datum valuty", "Dr.pohybu na IM", "Pracovní úsek", "Oper.ref.dokl.", "Profit centrum", "V měně účetního okruhu", "Dr.objektu příjemce", "Text účtů", "Jméno uživatele", "Zákl.měrná jednotka"]
columnnames = []
for line in listus:
if line in cur.execute('SELECT name FROM PRAGMA_TABLE_INFO("{}")'.format("db1")):
pass
else:
columnnames.append(line)
for line in columnnames:
try:
cur.execute("ALTER TABLE db1 ADD [{0}]".format(line))
except:
pass
return columnnames
def sort(indexus,loaded_sql,sheet):
ii = 0
sqldic = {}
for line in loaded_sql:
if ii == 0:
col = line
ii += 1
index_sql = [col.index(j) for j in indexus]
sqldic["".join(str(line[i]) for i in index_sql)] = line
ii = 0
exceldic = {}
for line in sheet.iter_rows(values_only=True):
if ii == 0:
col = line
ii += 1
index = [col.index(j) for j in indexus]
exceldic["".join(line[i] for i in index)] = line
to_write = {}
for key in exceldic.keys():
if key not in sqldic:
to_write[key] = exceldic[key]
return to_write
def write(cur,to_write,listus):
for key,line in to_write.items():
a = "("+"?,"*(len(line)-1) + "?)"
col = "({})".format(",".join([("[{}]".format(i)) for i in listus]))
ins_val = []
[ins_val.append(str(i)) for i in line]
try:
cur.execute("INSERT INTO db1 {0} VALUES {1}".format(col, a), ins_val)
except:
continue
def find_unknown(dodavatele, db_name, cur):
strsql = 'SELECT dodavatel FROM {}'.format(db_name)
all_sup = set(str(int(i[0])) for i in cur.execute(strsql) if i[0])
sup_dif = [x for x in list(all_sup.difference(set(dodavatele.keys())))]
return sup_dif
解决方案
在您的主程序中,您有一行
write(cur, to_write, listus)
但那里没有to_write
定义变量。我认为您的意图是:
to_write = sort(indexus, loaded_sql, sheet)
write(cur, to_write, listus)
作为旁注,根据PEP 8 ,所有导入都应位于文件顶部。否则代码很难阅读。
推荐阅读
- javascript - 双击按钮时,Boostrap 模型显示两次
- oracle - Oracle RMAN 我可以为每个数据库配置保留策略吗?
- asp.net-core - 登录后 ASP.NET 身份重定向到完整 URL
- docker - 如何使用网络驱动器上的文件夹创建 docker 映像?
- laravel - 为什么在 Lumen 查询中使用 get() 时无法加载响应
- jquery - 当前上下文中不存在 JsonRequestBehvior.AllowGet
- typeorm - 多次指定 typeorm 表名
- c# - 传递只有 PostSharp 可以看到的类对象
- firebase - 在 Flutter App 中从 Firebase 存储加载 PDF 文件
- canvas - 如何从每个 three.js 场景中获取单个 domElement 画布?