Python - NameError 名称 "title" 未定义

3
我将使用的数据集以多个文本文件形式存在,格式如下:

#*TITLE1
#@AUTHOR1,AUTHOR2
#tYEAR
#cpublicationvenue
#index1

每个块代表一篇论文。在我的数据集中,我有成千上万个这样的块。我想将此信息插入到我的数据库中,其中我有多个表。我编写的下面的代码有时候可以完美地工作。但在其他时候,当我尝试填充数据库时,它会随机地给我一个错误,例如:

NameError: name 'title' is not defined

我现在处于这个阶段,想把所有的数据放入我的数据库中,但是我希望确保这段代码已经考虑到了当一个块缺少出版物位置行时应该怎么办,在这种情况下,只需在该行中留空该列。

以下是我编写的代码:

import MySQLdb


conn = MySQLdb.connect(host="xx", user="xx", db="xx")
db1 = conn.cursor()


with open("path/to/file", "rb") as f:
    for line in f:
        if line.startswith("#*"):
            title = line[2:]

        elif line.startswith("#t"):
            year = line[2:]  # will ignore first two characters of line

        elif line.startswith("#c"):
            publication_venue = line[2:]

        elif line.startswith("#index"):
            ID = line[6:]

    elif line.startswith("#@"):
        author_list = line.split(",")
        author_list[0] = author_list[0][2:]  

    elif line.strip() == '':

        db1.execute('''INSERT INTO papers(
                ID, TITLE, YEAR, Publication_Venue)
                VALUES (%s,%s,%s,%s,%s)''',
                (ID, title, year, publication_venue))


        for In_order, author in enumerate(author_list, start=1):
            In_order = In_order
            author = author

            db1.execute('''INSERT INTO authors(
                        ID, AUTHOR, In_order) VALUES(%s,%s,%s)''',
                        (ID, author, In_order))


        conn.commit()

        title = None
        year = None
        publication_venue = None
        ID = None
        author_list = None

    else:
        continue

有人能告诉我为什么我的代码中明确定义了名称,但还是出现名称错误吗?!


你确定 line.startswith("#*") 是否真的为真吗?或许可以在这个代码块中加入一个打印语句来检查一下。 - Morgan Thrapp
1个回答

1

你只在第一个 if 内定义了 title

if line.startswith("#*"):
    title = line[2:]

如果您没有到达那里(该行不以#*开头),它是未定义的。
由于您指定了以下内容,因此问题变得非常明显:

我编写的下面的代码有时候可以完美地工作。其他时候,当我尝试填充数据库时,它会随机给我一个错误。


当我说有时候,例如当我使用一个文本文件来填充表格时,它会完美地工作,所有信息都被正确插入,但是当我尝试使用另一个格式完全相同的文本文件时,它会给我这个名称错误。我可以理解你所说的标题仅在第一个if语句中定义。我该如何修复这个错误?我应该在每个if else中定义它吗?还是应该将if else语句包含在第一个if语句中?抱歉,我是Python新手。@Idos - John Power
@JohnPower 你应该添加一个 print 来实际跟踪它的值。为了修复这个问题,最好在所有 if(在 for 之前)之前分配一些东西给它(甚至是 title = ' '),以避免代码重复。 - Idos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接