Python中JSON格式文本文件转DataFrame时读取结果为空的问题咨询
问题原因及解决方案
核心问题原因
- JSON格式不兼容:你提供的JSON字符串使用单引号包裹键和字符串值,不符合标准JSON规范(标准JSON要求必须使用双引号)。Python内置的
json.loads严格遵循JSON规范,碰到单引号会直接抛出解析异常,而你使用了无参数的except捕获所有异常后直接跳过该行,所有行都解析失败就会导致tweets_data为空列表。 - 其他可能触发该问题的原因:
- 文件路径错误:指定的
data.txt不存在,或者相对路径和代码实际运行的工作目录不匹配,读取不到文件内容 - 文件存在空行/换行异常:部分行不是完整的字典结构,解析失败
- 编码不匹配:文件存储编码和Python默认读取文件的编码不一致,读取内容乱码无法解析
- 文件路径错误:指定的
解决方案
1. 优先解决单引号解析问题
推荐使用更兼容的解析方式,避免替换字符串带来的潜在问题:
导入Python标准库的ast模块,使用ast.literal_eval替代json.loads,该方法支持解析Python风格的单引号字典字符串,安全性和兼容性更高。
如果确认字符串内容本身没有单引号,也可以将每行内容的单引号替换为双引号后再用json.loads解析。
2. 补充异常排查与边界处理
- 读取文件前先校验文件路径是否存在
- 读取文件时显式指定编码,避免乱码问题
- 捕获异常时打印错误信息,方便定位具体问题
- 跳过空行,避免无意义的解析尝试
修复后完整代码
import ast import pandas as pd import os tweets_data_path = "data.txt" # 校验文件是否存在 if not os.path.exists(tweets_data_path): print(f"错误:文件 {tweets_data_path} 不存在,请检查路径") else: tweets_data = [] # 显式指定utf-8编码读取文件 with open(tweets_data_path, "r", encoding="utf-8") as tweets_file: for line_num, line in enumerate(tweets_file, 1): line = line.strip() # 跳过空行 if not line: continue try: # 兼容单引号的字典解析 tweet = ast.literal_eval(line) tweets_data.append(tweet) except Exception as e: # 打印错误信息方便排查 print(f"第{line_num}行解析失败:{str(e)},行内容片段:{line[:100]}") continue print(f"共成功解析{len(tweets_data)}条有效数据") if tweets_data: # 直接用json_normalize生成DataFrame,不需要额外调用from_dict df = pd.json_normalize(tweets_data) print(df.head()) else: print("无有效数据,无法生成DataFrame")
内容的提问来源于stack exchange,提问作者Data_Science_110
相关产品推荐
相关产品推荐

