如何在函数中定义空Pandas DataFrame?解决NameError问题
看起来你的问题主要有几个关键点,咱们一步步来解决:
1. 先解决核心的NameError问题
你提到在Python Shell里运行正常,但PyCharm里报NameError: name 'result_df' is not defined,这大概率是脚本缺失必要的导入语句或者PyCharm使用的Python环境和Shell不一致导致的:
(1)补充所有依赖库的导入
在你的脚本最顶部,必须加上这些导入语句——Shell里你可能手动导入过,但PyCharm运行脚本是从头执行的,没有导入的话解释器根本不知道pd、pa这些别名:
# 导入必要库 import pandas as pd import pyarrow as pa import pyarrow.parquet as pq import os import glob import re
(2)检查PyCharm的Python解释器
确保PyCharm使用的解释器已经安装了pandas和pyarrow:
- 打开PyCharm的
Settings(Mac是Preferences) - 找到
Project: [你的项目名]->Python Interpreter - 查看列表里有没有
pandas和pyarrow,没有的话点击+搜索安装
2. 修复你的myfunc函数逻辑错误
就算解决了NameError,你的函数还有一个致命问题:result_df.append(data)不会修改原DataFrame!因为Pandas的append方法是返回一个新的DataFrame对象,不会原地修改。所以你需要把这行改成:
result_df = result_df.append(data)
另外,直接用open读取JSON再传给pd.read_json有点多余,pd.read_json可以直接接收文件名,还能处理gzip压缩文件(如果你的.gz是压缩的JSON的话),可以简化代码:
def myfunc(filename, filepath): # 直接读取JSON文件,支持gzip压缩 data = pd.read_json(filename, lines=True, encoding='utf-8', compression='infer') # 写入parquet table_from_pandas = pa.Table.from_pandas(data) pq.write_table(table_from_pandas, filepath) return data
这样就不需要手动维护result_df了,直接读取后返回即可。
3. 优化主函数的文件查找逻辑
你的主函数里json_fi = glob.glob("*.json")可能找不到文件,因为当前工作目录不一定是/Users/milenko/mario/Json_gzips/,最好用绝对路径:
if __name__ == '__main__': basic = '/Users/milenko/mario/Json_gzips/' # 用绝对路径查找JSON文件 json_fi = glob.glob(os.path.join(basic, "*.json")) # 如果是.gz压缩的JSON,改成下面这行 # json_fi = glob.glob(os.path.join(basic, "*.json.gz")) my_dict = { 'ticr_calculated_2': 'ticr-2.parquet', 'ticr_calculated_3': 'ticr-3.parquet', 'ticr_calculated_4': 'ticr-4.parquet', 'tick_calculated_2': 'tick-2.parquet', 'tick_calculated_3': 'tick-3.parquet', 'tick_calculated_4': 'tick-4.parquet' } for key, value in my_dict.items(): for f in json_fi: # 用basename匹配,避免路径干扰 if re.match(key, os.path.basename(f)): filepath = os.path.join(basic, value) myfunc(f, filepath)
按照上面的步骤调整后,应该就能解决你的问题了。如果还有问题,可以检查一下文件路径是否正确,以及JSON文件的格式是否符合lines=True的要求(每行一个JSON对象)。
内容的提问来源于stack exchange,提问作者Djikii

