从内核访问文件和笔记本#
从 JupyterLite 0.1.0b9
开始,用户“文件浏览器”的内容和一些内核(包括 Pyodide 内核)会自动同步。
例如,您可以将文件 file.csv
拖放到 JupyterLite UI 中,然后将其加载到 Python 中
import pandas as pd
data = pd.read_csv('file.csv')
data
文件系统访问的工作原理#
从 JupyterLite 0.4.0 开始,用户“文件浏览器”的内容可以通过两种不同的方式暴露给内核
通过
Atomics.wait
(通过SharedArrayBuffer
)与内核进行同步通信通过 Service Worker
2. Service Worker#
如果浏览器中没有 SharedArrayBuffer
,JupyterLite 将默认回退到使用 Service Worker(直到 JupyterLite 0.4.0 默认使用)。
同步内容的工作原理是挂载一个自定义的 Emscripten 文件系统 (FS),它通过启用 JupyterLite ServiceWorker
与 JupyterLite 内容管理器通信。
注意
根据用户浏览器和 HTTP 服务器的限制,ServiceWorker
不会总是启用。
警告
如果这两个组件都没有启用,内核将无法访问和操作文件浏览器中列出的文件。
注意
以下 Python 内核支持通过 Service Worker 访问文件系统
✅
jupyterlite-pyodide-kernel
✅
jupyterlite-xeus
与 Xeus Python 内核
验证文件系统#
要检查文件系统同步是否启用,请查看 cwd
是否以 /drive/
开头
import os
os.getcwd() # If successful: "/drive/path/to/notebook"
# ... otherwise: "/home/pyodide"
获取远程内容#
也可以从远程 URL 获取内容。例如,如果您使用 Pyodide 内核,则可以使用 fetch
函数来实现此目的
import pandas as pd
from js import fetch
URL = "https://raw.githubusercontent.com/jupyterlite/jupyterlite/main/examples/data/iris.csv"
res = await fetch(URL)
text = await res.text()
filename = 'data.csv'
with open(filename, 'w') as f:
f.write(text)
data = pd.read_csv(filename, sep=',')
data
作为替代方案,您可以导入 pyodide-http
包(默认随 Pyodide 分发)以更无缝地使用熟悉的方法
import pyodide_http
import pandas as pd
pyodide_http.patch_all()
data = pd.read_csv("https://raw.githubusercontent.com/jupyterlite/jupyterlite/main/examples/data/iris.csv")
data