如何在R中读取CSV列存储的Python OrderedDict格式数据
R中读取Python OrderedDict序列化字符串的方法
你给出的字符串是Python的OrderedDict序列化结果,可通过以下两种方法解析:
方法1:调用Python解析(推荐,兼容性最高)
无需处理复杂正则,直接调用Python的collections.OrderedDict解析原始字符串,仅需要本地安装有Python环境:
- 先安装依赖包
install.packages(c("reticulate", "readr"))
- 解析代码
library(reticulate) library(readr) # 读取原始CSV文件 df <- read_csv("你的CSV文件路径.csv") # 定义解析函数 parse_orddict <- function(py_str) { py_run_string(sprintf("from collections import OrderedDict; res = %s", py_str))$res } # 批量解析A列所有字符串 parsed_results <- lapply(df$A, parse_orddict)
取值示例
# 取第一个解析结果的YTC下的V值 parsed_results[[1]]$YTC$V # 输出 "B1" # 取TA字段值 parsed_results[[1]]$TA # 输出 "80" # 取TL列表中第二个元素的Pe值 parsed_results[[1]]$TL[[2]]$Pe # 输出 "90"
方法2:转JSON解析(无需Python环境)
通过正则替换把Python结构转成标准JSON格式,再用JSON解析工具读取:
- 安装依赖包
install.packages(c("jsonlite", "stringr", "readr"))
- 解析代码
library(jsonlite) library(stringr) library(readr) df <- read_csv("你的CSV文件路径.csv") parse_orddict_json <- function(py_str) { processed <- py_str |> # 移除所有OrderedDict标识 str_remove_all("OrderedDict\\(") |> # 把Python元组的小括号替换为JSON数组的方括号 str_replace_all("\\(", "[") |> str_replace_all("\\)", "]") |> # 移除最外层多余的方括号 str_remove("^\\[") |> str_remove("\\]$") |> # 把键值对数组转为JSON对象格式 str_replace_all("\\['([^']+)',\\s*([^\\]]+)\\]", "\"\\1\": \\2") |> str_replace_all("\\[\\s*(\".+?\"\\s*:.+?)\\s*\\]", "{\\1}") return(fromJSON(processed)) } parsed_results <- lapply(df$A, parse_orddict_json)
结果转结构化表
如果需要把嵌套结果展开为二维数据框,可使用如下代码:
library(tidyr) library(dplyr) structured_df <- lapply(parsed_results, function(item) { # 提取第一层基础字段 base_info <- tibble(YTC_V = item$YTC$V, TA = item$TA) # 展开TL嵌套列表 tl_info <- lapply(item$TL, function(tl_item) { tibble(TC_V = tl_item$TC$V, TC_SD = tl_item$TC$SD, Pe = tl_item$Pe) }) |> bind_rows() # 合并字段 return(bind_cols(base_info, tl_info)) }) |> bind_rows()
内容的提问来源于stack exchange,提问作者Sidiv
相关产品推荐
相关产品推荐

