You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

错误原因

  1. 变量名错误:循环变量是f,但打开文件时用了open(file),这里的file未定义,导致循环抛出异常后直接终止,df从未被赋值。
  2. 不必要的循环内合并:每次循环都执行pd.concat会降低效率,应该在所有文件处理完成后再合并。
  3. 空列表判断缺失:如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:12:45