如何用Facebook JSON文件创建DataFrame?解决df未定义报错
解决Facebook Messenger JSON文件合并DataFrame时的NameError问题
问题描述
作为Python新手,我在处理个人项目时,尝试将Facebook Messenger单聊天下载的多个JSON文件合并为一个DataFrame。编写循环代码后运行出现NameError: name 'df' is not defined,尽管我在循环内定义了df。
原代码:
import pandas as pd import json, glob, os import numpy as np file_path = "work/Desktop/fb data/jsonmssg/message_1.json" file_dir = "work/Desktop/fb data/jsonmssg" json_pattern = os.path.join(file_dir, '*.json') file_list = glob.glob(json_pattern) dfs = [] for f in file_list: with open(file) as file: chat_history = json.loads(file.read()) json_data = pd.json_normalize(chat_history['messages']) dfs.append(json_data) df = pd.concat(dfs) df
报错信息:
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-74-00cf07b74dcd> in <module> ----> 1 df NameError: name 'df' is not defined
错误原因
- 变量名错误:循环变量是
f,但打开文件时用了open(file),这里的file未定义,导致循环抛出异常后直接终止,df从未被赋值。 - 不必要的循环内合并:每次循环都执行
pd.concat会降低效率,应该在所有文件处理完成后再合并。 - 空列表判断缺失:如果
file_list为空(比如路径错误、没有JSON文件),循环不会执行,df也不会被定义。
修正后的代码
import pandas as pd import json, glob, os import numpy as np file_dir = "work/Desktop/fb data/jsonmssg" json_pattern = os.path.join(file_dir, '*.json') file_list = glob.glob(json_pattern) dfs = [] # 先检查是否有匹配的文件 if not file_list: print("未找到任何JSON文件,请检查路径是否正确") else: for f in file_list: # 用循环变量f打开文件,别名用fp避免和内置file冲突 with open(f, 'r', encoding='utf-8') as fp: chat_history = json.load(fp) # 确保messages键存在 if 'messages' in chat_history: json_data = pd.json_normalize(chat_history['messages']) dfs.append(json_data) else: print(f"文件{f}中未找到'messages'键,跳过该文件") # 所有文件处理完成后再合并 df = pd.concat(dfs, ignore_index=True) # 查看合并后的结果 print(df.head())
关键修正点
- 把
open(file)改为open(f),匹配循环变量名。 - 将
pd.concat移到循环外,避免重复合并浪费资源。 - 添加文件存在性检查和
messages键的判断,提升代码健壮性。 - 使用
ignore_index=True重置合并后DataFrame的索引,避免索引重复。
内容的提问来源于stack exchange,提问作者Alice Campbell
相关产品推荐
相关产品推荐

