如何从单个纯文本文件按名称读取多个pandas DataFrame?
如何通过名称直接读取文件里的pandas DataFrame?
我有一个包含3个pandas DataFrame的输出文件,具体内容如下:
df1 A R N D 0 0.033333 0.086667 0.014444 0.058889 1 0.093333 0.084444 0.011111 0.034444 2 0.093333 0.084444 0.011111 0.034444 df2 A R N D 0 0.033333 0.008889 0.000000 0.055556 1 0.050000 0.016667 0.000000 0.058889 2 0.071111 0.018889 0.003333 0.027778 df3 A R N D 0 0.016667 0.007778 0.000000 0.003333 1 0.027778 0.002222 0.003333 0.024444 2 0.006667 0.000000 0.000000 0.055556我知道可以手动打开文件提取对应行后转为DataFrame,但想了解是否有内置方法可通过名称(如df1、df2)直接读取这些DataFrame。我是编程新手,希望得到通俗易懂的解答,谢谢。
先给你划重点:没有直接的内置方法,但有两种实用方案
这种打印出来的表格是给人看的「可视化输出」,不是pandas能直接识别的结构化格式,所以没有一键读取的内置函数,但下面两种方法能帮你轻松解决:
方案一:重新保存成序列化格式(推荐!新手友好,一步到位)
如果你能控制生成这个文件的代码,别再用print(df1)这种方式输出了,改用pandas专门的序列化工具保存,比如pickle(专门用来存Python对象的格式):
- 保存DataFrame时的代码:
import pandas as pd # 假设你已经有了df1、df2、df3这三个DataFrame # 把它们放进一个字典里,键就是你要的名称 df_collection = {"df1": df1, "df2": df2, "df3": df3} # 保存成pickle文件 pd.to_pickle(df_collection, "my_dataframes.pkl")
- 读取的时候直接按名称调用:
# 加载整个字典 loaded_dfs = pd.read_pickle("my_dataframes.pkl") # 直接通过键名获取对应的DataFrame df1 = loaded_dfs["df1"] df2 = loaded_dfs["df2"] df3 = loaded_dfs["df3"]
这种方法的好处是:完全不用手动处理文本,能完整保留DataFrame的所有信息(比如索引、数据类型),后续读取超简单!
方案二:手动解析现有纯文本文件(适合没法重新生成文件的情况)
如果只能用现有的这个纯文本文件,那我们可以写点小代码把每个DataFrame的内容分开,再转成DataFrame:
import pandas as pd # 第一步:读取整个文件的内容 with open("your_file.txt", "r") as file: full_content = file.read() # 第二步:把内容按空行分割成每个DataFrame的部分 df_parts = full_content.split("\n\n") # 用来存结果的字典 result_dict = {} # 第三步:逐个处理每个DataFrame的部分 for part in df_parts: # 跳过空的部分 if not part.strip(): continue # 把每一行分开 lines = part.split("\n") # 第一行就是DataFrame的名称(df1/df2/df3) df_name = lines[0].strip() # 剩下的行是表格内容,用空格分隔,转成DataFrame table_lines = "\n".join(lines[1:]) # 用read_table读取空格分隔的表格 df = pd.read_table(pd.io.common.StringIO(table_lines), sep="\s+") # 把结果放进字典 result_dict[df_name] = df # 现在就可以按名称调用啦! df1 = result_dict["df1"] df2 = result_dict["df2"]
注意:这个方法依赖于你的文件格式是固定的(比如每个DataFrame之间是空行分隔,名称单独占一行),如果文件格式有变化,可能需要调整分割的逻辑哦~
最后再啰嗦一句
为什么不能直接读取?因为print出来的表格是给人看的,没有统一的机器可读结构,而pickle这种序列化格式是专门为机器存储Python对象设计的,所以更可靠,新手优先选方案一哦!
内容的提问来源于stack exchange,提问作者ilam engl
相关产品推荐
相关产品推荐

