pandas读取ipynb文件夹数据相对路径
时间: 2025-07-27 07:22:17 AIGC 浏览: 25
<think>我们正在处理一个关于使用pandas读取.ipynb文件的问题。首先需要明确:1..ipynb文件是JupyterNotebook的格式,本质上是JSON文件。2.pandas本身没有直接读取.ipynb文件的函数,但我们可以通过读取JSON文件然后解析内容来获取代码或文本。3.用户要求使用相对路径。步骤:1.确定文件夹的相对路径。2.列出文件夹中所有的.ipynb文件。3.逐个读取这些文件(作为JSON读取)。4.解析JSON以提取所需内容(例如,代码单元格中的源代码)。但是注意:.ipynb文件的结构是分单元格的,每个单元格有类型(如"code"、"markdown")和内容。用户可能想要读取代码单元格或者文本单元格。由于用户没有具体说明要读取什么内容,我们假设用户想要读取代码单元格中的代码(作为文本)或者markdown单元格中的文本。我们可以使用以下步骤:-使用`json`模块读取文件。-遍历每个单元格(cell),根据类型提取内容。另外,pandas可以用来存储提取的数据,例如将每个文件的代码内容存储为一个DataFrame的一行。但是注意:用户的问题中提到了“处理相对路径的问题”,所以我们将使用相对路径来定位文件夹。示例代码:假设当前工作目录是项目根目录,我们有一个名为`notebooks`的文件夹,里面存放了.ipynb文件。步骤:1.导入必要的库:os, json, pandas2.定义相对路径3.遍历该路径下的所有.ipynb文件4.读取每个文件,解析JSON,提取所需内容(例如,所有代码单元格的源代码合并成一个字符串)5.将文件名和内容存储到DataFrame中注意:相对路径可以通过`os.path.join`来构建,或者直接使用相对路径字符串。示例代码:
```pythonimport osimportjsonimport pandasas pd#定义相对路径(相对于当前工作目录)folder_path= "notebooks"#假设文件夹名为notebooks,位于当前目录下#列出所有.ipynb文件file_list= [f forf inos.listdir(folder_path) iff.endswith('.ipynb')]
#初始化一个列表来存储数据data =[]
forfilenamein file_list:#构建相对路径的文件file_path =os.path.join(folder_path, filename)with open(file_path, 'r',encoding='utf-8')as f:notebook =json.load(f)#提取代码单元格的内容code_cells =[]for cellin notebook['cells']:ifcell['cell_type'] =='code':#代码单元格,将源代码列表中的每一行连接成一个字符串code=''.join(cell['source'])code_cells.append(code)#将所有代码单元格的内容合并成一个字符串,每个单元格之间用换行分隔all_code= '\n'.join(code_cells)#将文件名和代码内容添加到数据列表data.append({'filename':filename,'code': all_code})#创建DataFramedf =pd.DataFrame(data)#显示DataFrameprint(df)```这个示例将每个.ipynb文件中的所有代码单元格的内容提取出来,并存储在一个DataFrame中,每行包含文件名和代码内容。如果用户需要提取其他类型的内容(如markdown),可以修改条件。注意:.ipynb文件可能很大,且代码单元格可能包含大量代码。如果用户需要更细粒度的分析(如按单元格存储),则数据结构需要调整。另外,相对路径的处理:上面的代码中`folder_path`是相对于当前工作目录的。当前工作目录通常是运行Python脚本的目录。如果用户需要从其他位置指定相对路径,可能需要调整。关于相对路径的说明:-在Jupyter Notebook中运行,当前工作目录通常是.ipynb文件所在的目录。-在独立脚本中运行,当前工作目录是执行脚本的目录。因此,用户需要确保相对路径正确。如果脚本和文件夹不在同一个目录,可能需要使用`os.chdir`改变工作目录,或者使用更复杂的路径处理(如`os.path.dirname(__file__)`来获取脚本所在目录)。但是,用户要求使用相对路径,所以上述代码使用相对于当前工作目录的路径。如果用户需要处理子文件夹中的.ipynb文件,可以使用`os.walk`。下面是一个处理子文件夹的示例:
```pythonimport osimportjsonimport pandasas pd#定义根目录的相对路径base_dir= "notebooks"#相对路径#遍历所有子文件夹中的.ipynb文件file_list =[]
forroot,dirs, filesin os.walk(base_dir):for filein files:if file.endswith('.ipynb'):#获取文件的相对路径(相对于base_dir的上级目录?这里我们存储完整相对路径)#或者存储相对于base_dir的路径?根据用户需求,这里存储从base_dir开始的路径#注意:os.walk的root是当前遍历的目录,file是文件名rel_path= os.path.relpath(root, base_dir)#相对于base_dir的路径#如果文件就在base_dir下,那么rel_path会是'.',我们可以处理一下ifrel_path== '.':full_rel_path =fileelse:full_rel_path =os.path.join(rel_path, file)#但是我们需要读取文件的绝对路径(或相对于当前工作目录的路径)应该是os.path.join(root,file)file_list.append((full_rel_path, os.path.join(root,file)))#初始化数据列表data =[]
forrel_path, full_path infile_list:with open(full_path,'r', encoding='utf-8') asf:notebook= json.load(f)#提取代码code_cells= []forcell innotebook['cells']:if cell['cell_type']== 'code':code= ''.join(cell['source'])code_cells.append(code)all_code= '\n'.join(code_cells)data.append({'relative_path':rel_path, 'code':all_code})
df= pd.DataFrame(data)
```这个版本会遍历`base_dir`下的所有子文件夹,并记录每个文件的相对路径(相对于base_dir)。这样,用户可以看到文件在子文件夹中的位置。注意事项:-文件编码:通常使用utf-8。-错误处理:如果文件不是有效的JSON,需要捕获异常。-大型文件:如果文件很大,读取和解析可能需要时间。根据用户需求,可能还需要提取其他元数据,如单元格的执行顺序、输出等,但用户问题中未提及。因此,我们提供了一个基本的框架,用户可以根据需要调整。最后,生成相关问题:1.如何从.ipynb文件中提取markdown文本?2.如何将多个.ipynb文件的代码合并分析?3.如何处理.ipynb文件中的图片或其他二进制内容?4.如何将提取的代码保存到单独的.py文件中?5.如何解析.ipynb文件中的输出结果?注意:用户的问题中引用了站内引用,但内容是关于文件重命名的,与当前问题无关,因此我们忽略它。回答用户问题:</think>### 使用 Pandas 读取文件夹中的 IPYNB 文件(相对路径)
IPYNB 文件本质是 JSON 格式的笔记本文件,Pandas 没有直接读取 IPYNB 的内置方法,但可以通过以下步骤实现:
#### 步骤 1:准备环境
```python
import os
import json
import pandas as pd
from pathlib import Path
```
#### 步骤 2:处理相对路径
```python
# 获取当前脚本所在目录(相对路径基准)
base_dir = Path(__file__).parent if "__file__" in locals() else Path.cwd()
# 设置目标文件夹的相对路径
target_folder = base_dir / "notebooks" # 示例文件夹名
```
#### 步骤 3:读取并解析 IPYNB 文件
```python
def read_ipynb_files(folder_path):
data = []
for file in folder_path.glob("*.ipynb"):
try:
with open(file, "r", encoding="utf-8") as f:
notebook = json.load(f)
# 提取元数据和内容
cells = [
{
"file": file.name,
"cell_type": cell["cell_type"],
"source": "".join(cell["source"]),
"execution_count": cell.get("execution_count", None)
}
for cell in notebook["cells"]
]
data.extend(cells)
except Exception as e:
print(f"Error reading {file}: {str(e)}")
return pd.DataFrame(data)
```
#### 步骤 4:执行并查看结果
```python
# 调用函数创建 DataFrame
df = read_ipynb_files(target_folder)
# 查看前 5 行
print(df.head())
# 统计不同类型单元格的数量
print("\n单元格类型分布:")
print(df["cell_type"].value_counts())
```
#### 关键说明:
1. **路径处理**:
- 使用 `Pathlib` 自动处理操作系统路径差异
- `Path(__file__).parent` 获取当前脚本所在目录
- 符号 `/` 用于路径拼接(比 `os.path.join` 更简洁)
2. **数据结构**:
- 每个单元格转换为 DataFrame 中的一行
- 包含文件名、单元格类型、代码/文本内容、执行计数
3. **异常处理**:
- 捕获 JSON 解析错误和文件访问错误
- 跳过损坏的文件避免中断流程
4. **输出示例**:
```
| file | cell_type | source | execution_count |
|------------|-----------|-----------------|-----------------|
| analysis.ipynb | code | import pandas...| 1 |
| analysis.ipynb | markdown | # Data Analysis | None |
```
### 常见问题解决
**问题 1:文件编码错误**
```python
# 尝试不同编码方案
with open(file, "r", encoding="utf-8-sig") as f: # 处理 BOM 头
...
```
**问题 2:处理子目录**
```python
# 递归搜索子文件夹
files = list(folder_path.rglob("*.ipynb")) # 替换 glob
```
**问题 3:提取特定内容**
```python
# 只提取代码单元格
code_cells = [cell for cell in notebook["cells"]
if cell["cell_type"] == "code"]
```
### 典型应用场景
1. **批量分析 Notebook**:统计代码/文档比例
2. **知识提取**:收集所有 Markdown 注释创建知识库
3. **代码质量检查**:分析代码单元格中的导入语句
4. **自动化文档**:生成 Notebook 目录索引[^1]
阅读全文
相关推荐
















