ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Google Colab 数据集加载与 .py 脚本运行避坑指南

Google Colab 数据集加载与 .py 脚本运行避坑指南 1. Colab 环境认知与两种运行路径的选择刚接触 Google Colab 的人十有八九会在同一个地方卡住代码写好了数据集也准备好了但一按运行就报FileNotFoundError或者干脆提示找不到某个.py文件。这不是你代码写得烂而是 Colab 和本地 IDE 的运行机制完全不同很多人用 PyCharm 的习惯直接搬到 Colab 上必然出问题。Colab 本质是一台跑在云端的临时 Linux 虚拟机你打开一个 notebook它就给你分配一台机器关掉页面一段时间后这台机器会被回收里面所有临时文件全部清空。这跟你在本地电脑上有个固定硬盘、文件永久存在是两码事。所以理解 Colab 的第一步就是接受环境是一次性的这个前提所有的数据集加载和文件运行方案都是围绕这个前提来设计的。围绕这个临时环境加载数据集和运行文件其实就两条大思路。第一条是把数据喂进这台临时机器比如本地上传、从网络下载、通过 API 拉取第二条是把数据挂进来最典型的就是挂载 Google Drive让云端硬盘变成这台临时机器的一个目录。运行文件同样分两类一类是直接在 notebook 单元格里写代码跑另一类是上传.py、.sh这类独立脚本用命令行方式去执行。选择哪条路取决于三个变量数据体积、使用频率、是否需要持久化。几百 MB 的临时数据本地上传最省事几个 GB 的训练集挂 Drive 或从云端拉取更靠谱如果你每周都要重跑一遍实验那挂 Drive 几乎是唯一选择否则每次开机都要重新上传时间全浪费在等待上。我见过太多人一上来就闷头写模型代码结果在数据加载这一步反复折腾两小时。先把加载路径理顺后面写模型的时间能省出一大半。接下来的内容我就按照先解决数据怎么进来再解决文件怎么跑起来最后讲报错怎么排查的顺序展开每一步都会给出可直接抄的代码和踩过的坑。2. 从零开始搞定数据集加载数据加载是所有实验的起点也是 Colab 新手翻车率最高的环节。下面这几种方式我全都反复用过各有各的适用场景我把它们的优缺点和具体操作都摊开讲。2.1 上传本地文件最直接但也最容易踩坑的路Colab 左侧有个文件夹图标点开能看到一个文件浏览器顶部有上传按钮。这是最符合直觉的方式拖一个文件进去几秒钟就好了。代码里直接按文件名读取即可import pandas as pd df pd.read_csv(data.csv) print(df.shape)看起来很简单但这里有几个隐藏的坑必须提前说清楚。第一上传的文件存在/content/目录下这是 Colab 的默认工作目录。如果你在代码里写的是相对路径data.csv实际上等价于/content/data.csv。但很多人写代码时会写成./data/data.csv觉得应该有个 data 文件夹结果自然报错因为上传的文件是平铺在/content/根下的不会自动归类。第二上传有体积限制。单个文件大概几百 MB 还能撑住超过 1 GB 基本就会卡死或者中途断开。上传过程中页面不能刷新一旦网络抖动前功尽弃。所以这套方式只适合小文件、临时用一下的场景。第三也是最多人忽略的一点文件是存在临时磁盘上的运行时间到了或者手动断开连接文件就没了。下次重连你得重新上传。如果你只是想快速验证一段读取逻辑这没问题但如果你要跑一个需要反复调试的训练流程每次重传数据会让人崩溃。提示上传大文件建议先压缩成 zip上传后用!unzip在 Colab 里解压传输效率比一个个小文件高得多也不容易中途断掉。2.2 挂载 Google Drive大文件与长期项目的首选只要你的数据超过几百 MB或者你打算隔几天再回来接着跑就应该老老实实挂载 Google Drive。这是 Colab 里最稳定、最推荐的方式。挂载本身就三行代码from google.colab import drive drive.mount(/content/drive)运行后会弹出一个授权窗口点同意、复制验证码、粘贴回车就挂好了。挂载成功后你的 Google Drive 根目录会映射到/content/drive/MyDrive/。假设你在 Drive 里建了个projects/文件夹里面放着train.csv那读取路径就是df pd.read_csv(/content/drive/MyDrive/projects/train.csv)这里有个非常经典的问题很多人挂载完之后用os.listdir(/content/drive)只看到一个MyDrive然后找不到自己上传的文件就以为挂载失败。其实不是失败是你的文件在MyDrive里面路径要写全。另一个高频坑是路径里的空格和中文。Google Drive 里如果你建了个叫我的项目的文件夹路径里带中文读取时可能因为编码问题直接报错。我的习惯是 Drive 里的项目目录一律用英文小写加下划线比如ml_project能省掉一大堆莫名其妙的路径问题。速度方面要有心理预期。挂载 Drive 读取大文件时第一次读取会有明显延迟因为数据要从云端拉过来。如果数据集是几万张小图片逐个读取会非常慢。这时候正确的做法是先!cp把整个文件夹拷到/content/本地磁盘再从本地读!cp -r /content/drive/MyDrive/ml_project/dataset /content/dataset本地磁盘读写速度比挂载盘快一个数量级训练循环里读数据的效率会明显提升。唯一的代价是拷贝本身要花点时间以及本地磁盘空间有限太大的数据集要掂量一下。2.3 从网络拉取GitHub、Kaggle 与直链下载有时候数据不在你手里而是在 GitHub 仓库里或者 Kaggle 上。这时候用命令行直接拉取比手动上传高效得多。从 GitHub 拉整个仓库最省事的是!git clone https://github.com/用户名/仓库名.git拉下来之后会有一个同名文件夹出现在/content/下。如果只要仓库里的单个数据文件可以直接用wget拉原始文件链接!wget https://raw.githubusercontent.com/用户名/仓库名/main/data/train.csvKaggle 数据集稍微特殊一点需要通过 API 认证。流程是先去 Kaggle 账号设置里生成一个kaggle.json文件里面是用户名和 key然后from google.colab import files files.upload() # 上传 kaggle.json上传后把文件放到指定位置并设权限再调用下载命令!mkdir -p ~/.kaggle !cp kaggle.json ~/.kaggle/ !chmod 600 ~/.kaggle/kaggle.json !kaggle datasets download -d 数据集标识 !unzip 数据集标识.zip这套流程跑通一次之后以后换数据集只改最后一行的标识就行非常顺手。需要注意的是kaggle.json里是你的私密凭证不要把它分享给别人也不要在公开的 notebook 里明文写出来。对于普通的直链文件还有个更 Python 的方式用gdown或requests下载!pip install gdown -q !gdown --id 文件IDgdown特别适合下载 Google Drive 上分享出来的大文件比挂载后再拷贝更直接。这一步的关键是拿到文件 ID就在分享链接里/d/和/view之间的那串字符。2.4 路径管理为什么你的代码总是报 FileNotFoundError前面几种方式讲完我发现真正让新手崩溃的不是怎么加载而是加载完了找不到。九成的FileNotFoundError都出在路径上所以单独拎出来讲。排查路径问题的第一招是先确认再读取。在读取文件之前永远先跑一句import os print(os.getcwd()) print(os.listdir(.))os.getcwd()打印当前工作目录os.listdir(.)列出当前目录下的所有文件和文件夹。你亲眼看到文件名之后再照着写路径就不会错。这个习惯我建议保留到你彻底熟悉 Colab 为止能省下大量抓狂时间。第二招是善用绝对路径。相对路径在 Colab 里非常容易出错因为工作目录可能因为你执行了%cd或者os.chdir而变化。用绝对路径虽然写起来长一点但不会被工作目录的变动坑到。挂载 Drive 用/content/drive/MyDrive/...本地上传用/content/文件名心里有数。第三招针对中文和特殊字符。文件路径里带中文、空格、括号都可能让读取失败。如果你的数据文件是中文名改名的成本远低于写一堆转义处理的成本。加载方式适用体积是否持久速度推荐场景本地上传小于 500 MB否快快速验证、临时小文件挂载 Drive不限是首次慢长期项目、大文件GitHub / wget中否中开源数据集、代码Kaggle API大否中竞赛数据集gdown大否中Drive 分享的大文件注意挂载 Drive 之后如果中途修改了 Drive 里的文件Colab 有时不会立即刷新重新执行挂载或者等待一会儿再读取避免读到旧缓存。3. 让 .py 文件和脚本真正跑起来数据加载搞定接下来是把代码跑起来。很多人习惯了本地点一下运行按钮到了 Colab 面对.py文件就不知道从哪下手。其实 Colab 支持的命令行能力和 Linux 终端几乎一样掌握几个关键姿势就够了。3.1 直接执行 .py 的几种姿势与区别最基础的运行.py文件的方式是用叹号加 Python!python train.py这行命令会启动一个子进程运行train.py输出直接打印在单元格里。前提是这个文件在当前目录下。如果你从 GitHub 拉了一个项目通常要先切进去%cd 项目文件夹 !python train.py这里要区分!和%两个前缀。!表示在 Colab 的系统 shell 里执行命令%是 Colab 的魔术命令%cd是切换工作目录。切目录必须用%cd或者os.chdir不能用!cd因为!cd只影响那一次子进程执行完就退回原目录了这是新手非常容易踩的坑。还有一种方式是%run%run train.py%run和!python有什么区别简单说%run是在当前 notebook 的内核进程里执行脚本脚本里定义的变量、函数在运行结束后还能在单元格里继续用而!python是新开一个进程跑完就结束了变量不会留在当前环境。如果你想在脚本跑完后接着在 notebook 里分析结果用%run如果脚本是个独立的训练流程用!python更干净。运行.sh脚本的方式类似!bash run.sh !chmod x run.sh ./run.sh第二种方式先加执行权限再运行遇到权限报错时用这个。3.2 带参数脚本的运行与命令行参数传递真实项目里的脚本基本都带参数比如指定数据路径、学习率、批大小。Colab 传参数跟本地命令行一样!python train.py --data_path /content/train.csv --epochs 20 --lr 0.001脚本内部用argparse接收import argparse parser argparse.ArgumentParser() parser.add_argument(--data_path, typestr) parser.add_argument(--epochs, typeint, default10) parser.add_argument(--lr, typefloat, default0.001) args parser.parse_args() print(args.data_path, args.epochs, args.lr)这里有个细节值得展开。Colab 里空格传参容易被 notebook 的解析搞乱尤其是路径里如果带了别名或特殊符号。稳妥的做法是把参数值用引号包起来或者干脆在脚本内用默认值命令行只覆盖需要改的那几个。另外如果你是在 notebook 单元格里直接调用脚本的函数而不是命令行启动那参数可以直接当函数参数传没必要绕argparse。很多教程把两种方式混着讲反而让人糊涂。判断标准很简单需要子进程隔离就用命令行传参不需要就直接函数调用。提示脚本运行时间较长时可以在命令末尾加 log.txt 21把输出重定向到文件避免单元格输出太长刷新页面后丢失日志。配合!tail -f log.txt还能实时看进度。3.3 包导入与自定义模块的路径问题跑一个多文件项目时最头疼的往往是导入报错。主脚本train.py里写了from utils import load_data结果一跑就报ModuleNotFoundError。原因在于 Python 只会在特定目录里寻找模块而 Colab 的默认搜索路径不一定包含你的项目目录。解决办法有两种。第一种是运行前把项目目录加进sys.pathimport sys sys.path.append(/content/项目文件夹) from utils import load_data第二种是确保你在项目根目录下运行脚本并且项目里有__init__.py文件哪怕内容是空的让 Python 把文件夹当成包。相对导入from .utils import load_data对目录结构有严格要求新手建议先用第一种绝对路径的方式跑通再说。还有一个常见场景是安装项目依赖。很多开源项目根目录有个requirements.txt直接!pip install -r requirements.txt -q-q是安静模式减少输出刷屏。注意pip install装的东西在 Colab 重启后会丢失所以每次重连都要重新装一遍。这也是为什么我建议把安装命令写进 notebook 最上面几个单元格重连后从头跑一遍就行。如果遇到某个包装不上先别急着重试。看一下报错里是版本冲突还是找不到包。Colab 预装了大量常见库很多时候是版本不匹配而不是缺包。用!pip show 包名看当前版本需要特定版本就用!pip install 包名版本号。装完之后 Colab 有时会提示需要重启运行时按提示点一下重启别硬撑否则版本不会生效。导入报错典型原因解决方式ModuleNotFoundError模块不在搜索路径加 sys.path 或用 %cd 切目录ImportError: cannot import name循环导入或文件名冲突检查同名文件、调整导入顺序版本冲突依赖版本不匹配pip show 查版本指定安装找不到包确实没装pip install 后重启运行时4. 常见报错与排查技巧实录前面的内容把正常情况怎么做讲清楚了但真实操作中报错才是常态。这一节我把反复遇到过的典型问题整理成排查清单遇到报错按图索骥比盲目搜索快得多。4.1 文件找不到类报错FileNotFoundError: [Errno 2] No such file or directory是我在 Colab 里见过最多的报错没有之一。排查顺序固定三步走。第一步确认文件到底在不在。跑!ls -la和!find /content -name 文件名前者列出当前目录后者在整个/content下搜索。只要文件真实存在这一步就能定位到它的完整路径。第二步检查路径拼接。最常见的错误是os.path.join(/content/data, train.csv)写成了os.path.join(/content/data/, /train.csv)注意第二个参数前面的斜杠会导致前面路径被完全覆盖变成从根目录找。这个坑极其隐蔽因为代码看起来完全合理。拼接路径时第二个参数不要以斜杠开头。第三步检查挂载状态。Drive 挂载有时会掉尤其是在长时间空闲后。如果路径是/content/drive/...且文件明明在 Drive 里先重新挂载一次再试。4.2 依赖与版本类报错ModuleNotFoundError、ImportError、AttributeError: module has no attribute这几个基本都跟环境有关。我的处理逻辑是这样的先看报错信息里的模块名ModuleNotFoundError说明没装直接!pip install 模块名ImportError或AttributeError往往是版本太旧或太新用!pip show 模块名看版本然后对照项目文档要求的版本去装。有个特别容易被忽略的点Colab 默认环境里已经有 numpy、pandas、torch 这些库但版本可能跟你项目要求的不一样。装新版本有时会连带升级一堆依赖导致原本能跑的代码反而崩了。所以如果能用默认版本就跑通尽量别乱升级。真需要特定版本时装完记得重启运行时让版本生效。还有一种情况是包名和导入名不一致比如安装的是scikit-learn导入时写import sklearn。这个不算报错高发区但在一些冷门库上确实会让人困惑。装之前搜一下安装名 导入名就行。4.3 运行时中断与内存问题Colab 免费版有两个硬限制运行时长和内存。运行到一半突然断掉页面提示运行时已断开连接基本是超时或者内存爆了。内存问题的信号很明显运行过程中内存条逐渐变红然后崩溃。这时候要检查是不是一次性把整个数据集读进了内存。训练大模型时用生成器或DataLoader分批读取不要用df pd.read_csv(大文件)硬啃。数据量大的话先用df.sample()抽样验证逻辑确认没问题再上全量。运行时超时的话Colab 免费版在长时间空闲时会自动断开。解决办法是保持页面活跃以及及时把中间结果保存到 Drive。训练脚本最好设计成能断点续跑定期把模型权重存到挂载盘里。这样即使断了重连后从最近的检查点继续就行不至于从头再来。注意不要把重要数据只存在 Colab 本地磁盘上。临时环境随时可能回收所有需要保留的文件第一时间同步到 Drive这是我踩过几次数据全丢的教训之后养成的习惯。5. 提速习惯与工程化小技巧把上面这些跑通之后你会发现每天真正耗时间的地方变成重复操作重新挂载 Drive、重新装依赖、重新上传文件。把这些流程工程化能让效率提升一大截。我现在的习惯是在每个 notebook 最前面放一组环境初始化单元格装依赖、挂载 Drive、切目录、定义几个常用的路径变量。重连之后从上到下点一遍几十秒就能恢复到可工作状态比每次都手动敲命令快得多。路径管理上我会在开头定义一组常量比如DATA_DIR /content/drive/MyDrive/ml_project/data OUTPUT_DIR /content/drive/MyDrive/ml_project/outputs后面所有代码都引用这两个变量。好处是万一项目搬家只改一行就行不用全文件搜索替换路径字符串。这个习惯在本地项目里可能显得多余但在 Colab 这种路径容易变的环境里能省下大量调试时间。还有个提升运行效率的细节把要反复读取的数据在运行开始时一次性拷到/content本地训练循环里只读本地。前面提过挂载盘适合存不适合频繁读。一个几十 GB 的数据集可能放不下但中等规模的数据集这样操作训练速度提升非常明显。最后说一个关于文件组织的经验。Colab 里每个文件默认平铺在当前目录项目一多就乱成一锅粥。建议一进项目就建好目录结构data、src、outputs分开放代码里路径引用清晰。这不是为了好看而是为了报错时能快速定位文件到底在哪个层级。目录结构混乱的项目一旦报路径错误排查时间会成倍增加。这套流程我在多个项目里反复打磨过从最初的每次重传数据、每天重装环境到现在重连三分钟进入状态差别全在这些看似琐碎的习惯上。数据集加载和文件运行看似是入门级别的操作但真要做到稳定高效靠的不是记住几条命令而是理解 Colab 这套临时云环境的工作逻辑然后顺着它的特点去设计自己的工作流。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进