从内核访问文件和笔记本#
从 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