我正在尝试获取40,000行CSV文件,并将每行变成SQL数据库中WordPress网站的有效WooCommerce产品信息。但是,许多行共享相同的信息,这些信息正变成和GUID。由于每个子弹和GUID都必须唯一,所以这就带来了一个问题。
我的解决方案是编写一个递归函数:
我遇到的问题是,当我在return语句中递归引用该函数时,它实际上什么也没做。
我可以确认参数确实在更新,但是该函数实际上并没有使用更新后的参数运行。
参见下文:
def postCheck(guid, slug, num) :
cursor.execute("select * from wp_site_posts where post_type='product' and guid='"+guid+"' and post_name='"+slug+"'")
posts = cursor.fetchall()
try:
if (guid == posts[0][18]):
print('Existing slug/guid: ' + slug + ' / ' + guid)
slug = slug + '-' + str(num)
guid = 'http://site.test/product/'+ slug
num += 1
return postCheck(guid, slug, num)
except IndexError:
return
postCheck(guid_var, slug_var, 1)
我完全不知道为什么这不起作用。我已经检查了StackOverflow,看来其他人要记住的主要问题是在再次调用该函数之前记得包括“ return”关键字。
答案 0 :(得分:0)
如果您的guid尚未在数据库中-也就是说,当if
的测试为false时-您的函数将不执行任何操作,因为它没有else
,几乎没有if
之后的其他代码。
将return
放在递归调用之前意味着您永远不会进行递归调用。
一种更好的方法可能是将搜索新的guid放在一个循环中,直到找到一个新的guid,然后在该循环之后找到一个新的guid。
答案 1 :(得分:0)
您的函数无法将值返回给调用程序。您的递归中没有基本情况。重复进行直到得到IndexError
;此时,您将返回无值(即None
),直到将堆栈爬回到调用程序为止。
您需要一个基本情况:一个if
会识别“这就是我真正要寻找的东西”,并返回那个值,而不是您从{{1 }}。另外,可以在exception子句中返回该值。