连接SQLite并导入JSON数据时如何解决缩进错误?
解决SQLite插入JSON数据时的缩进错误问题
你遇到的这个IndentationError在Python里真的是高频坑——说白了就是代码里的缩进风格不统一,要么混着用了空格和制表符(Tab),要么缩进的数量乱了,导致Python没法识别正确的代码层级。
先看你给出的报错信息:
File "roster.py", line 51
cur.execute('''INSERT OR IGNORE INTO Member(user_id,course_id,role)
^IndentationError: unindent does not match any outer indentation level
这行代码属于for entry in json_data:循环的内部代码,但它的缩进和循环里其他代码的缩进不匹配。Python对缩进的要求特别严格,同一层级的代码必须用完全一致的缩进规则(要么全用4个空格,要么全用Tab,绝对不能混着来)。
具体修复步骤
- 统一缩进风格:把代码里所有的Tab替换成4个空格(这是Python官方推荐的缩进方式)。你可以用编辑器的“批量替换”功能,一次性把所有Tab转换成空格。
- 对齐循环内的代码:
for循环下面的每一行代码(从name=entry[0]到最后的cur.execute(...))都要保持相同的缩进级别,确保它们都属于这个循环的内部逻辑。 - 顺便修复一个小bug:你的代码里
fname=roster_data.json这一行少了引号,应该写成fname='roster_data.json',否则Python会把roster_data当成变量,触发NameError。
修复后的完整代码
import sqlite3 import json conn = sqlite3.connect('rosterdb.sqlite') cur = conn.cursor() cur.execute( ''' DROP TABLE IF EXISTS USER; DROP TABLE IF EXISTS Course; DROP TABLE IF EXISTS Member; CREATE TABLE User ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, name TEXT UNIQUE ); CREATE TABLE Course ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, title TEXT UNIQUE ); CREATE TABLE Member ( user_id INTEGER, course_id INTEGER, role INTEGER, PRIMARY KEY (user_id, course_id) ) ''' ) fname = input('Enter file name: ') if len(fname) < 1: fname = 'roster_data.json' # 补全字符串引号 str_data = open(fname).read() json_data = json.loads(str_data) for entry in json_data: name = entry[0] title = entry[1] role = entry[2] print(name, title, role) cur.execute('''INSERT OR IGNORE INTO User (name) VALUES ( ? )''', ( name, ) ) cur.execute('SELECT id FROM User WHERE name = ? ', (name, )) user_id = cur.fetchone()[0] cur.execute('''INSERT OR IGNORE INTO Course (title) VALUES ( ? )''', ( title, ) ) cur.execute('SELECT id FROM Course WHERE title = ? ', (title, )) course_id = cur.fetchone()[0] cur.execute('''INSERT OR IGNORE INTO Member(user_id,course_id,role) VALUES(?,?,?)''',(user_id,course_id,role)) conn.commit()
另外建议你在编辑器里开启“显示空白字符”的功能,这样就能直观看到哪些地方用了Tab、哪些用了空格,后续排查缩进问题会方便很多。
内容的提问来源于stack exchange,提问作者Yuvraj Bohra
相关产品推荐
相关产品推荐

