Python 为什么我会得到一个';非类型';非';非类型';?
我有一系列函数,它们获取一个数据帧,清理数据,然后将数据发送到sqlite db 以下函数正在创建错误:Python 为什么我会得到一个';非类型';非';非类型';?,python,sqlite,pandas,nonetype,Python,Sqlite,Pandas,Nonetype,我有一系列函数,它们获取一个数据帧,清理数据,然后将数据发送到sqlite db 以下函数正在创建错误: def send_to_db(df, event_name): print df.describe() table_names = { 'Video Played': 'video_played', 'Item Information Click': 'item_info_click', 'Faved': 'faved',
def send_to_db(df, event_name):
print df.describe()
table_names = {
'Video Played': 'video_played',
'Item Information Click': 'item_info_click',
'Faved': 'faved',
'Add to Cart': 'add_to_cart',
'Tap to Replay': 'replay'
}
print table_names.get(event_name)
con = db.connect('/Users/metersky/code/mikmak/vid_score/test.db')
df.to_sql(table_names.get(event_name), con, flavor='sqlite', if_exists='append')
con.close()
我得到的错误是TypeError:“NoneType”对象不可编辑
这对我来说很奇怪,有两个原因:
1) print df.descripe()
为我提供了正确的输出,这意味着函数中该点的数据不是None
2) 数据被发送到sqlite数据库,我对此进行了验证。这意味着数据也不在那里
为什么会出现此错误?我的数据何时会变成None
回溯:
Traceback (most recent call last):
File "fetch_data.py", line 139, in <module>
df, event_name = send_to_db(df, event_name)
TypeError: 'NoneType' object is not iterable
您没有从函数返回任何内容,但需要一个包含两个项的元组
(df,event\u name)
:
调用函数时:
df, event_name = send_to_db(df, event_name)
您希望返回2项的元组
但是,函数隐式返回None
(因为没有非空的return
语句)
您需要修改函数以添加:
return df, event_name
更新:如果确实不需要函数的返回值,则不要使用赋值语句左侧的任何内容调用函数。这意味着从函数结果中解包元组。只需按如下方式调用函数:
send_to_db(df, event_name)
请参阅:其中说明:
这被称为顺序解包(sequenceunpacking)并适用于
右边的任何序列。序列解包需要
左侧的变量列表,其元素数与
序列的长度。请注意,多重赋值确实非常重要
只是元组打包和序列解包的组合
您没有从函数返回任何内容,但需要一个包含两个项的元组
(df,event\u name)
:
调用函数时:
df, event_name = send_to_db(df, event_name)
您希望返回2项的元组
但是,函数隐式返回None
(因为没有非空的return
语句)
您需要修改函数以添加:
return df, event_name
更新:如果确实不需要函数的返回值,则不要使用赋值语句左侧的任何内容调用函数。这意味着从函数结果中解包元组。只需按如下方式调用函数:
send_to_db(df, event_name)
请参阅:其中说明:
这被称为顺序解包(sequenceunpacking)并适用于
右边的任何序列。序列解包需要
左侧的变量列表,其元素数与
序列的长度。请注意,多重赋值确实非常重要
只是元组打包和序列解包的组合
请提供回溯,以便我们能够清楚地看到错误及其发生的位置。请提供回溯,以便我们能够清楚地看到错误及其发生的位置。我需要这样做,即使我不需要返回任何内容?我只需要将数据发送到db,然后for循环移动到我需要处理的下一个事件。这就是调用函数的方式。Yes@Meepl:不,当然,如果您不需要返回任何内容,则不需要执行此操作…但是您不能使用不存在的返回值。只需将其称为
send\u to\u db(df,event\u name)
而不是df,event\u name=send\u to\u db(df,event\u name)
。即使我不需要返回任何内容,我也需要这样做?我只需要将数据发送到db,然后for循环移动到我需要处理的下一个事件。这就是调用函数的方式。Yes@Meepl:不,当然,如果您不需要返回任何内容,则不需要执行此操作…但是您不能使用不存在的返回值。只需将其称为send\u to\u db(df,event\u name)
而不是df,event\u name=send\u to\u db(df,event\u name)
。