从协作实验室删除文件,而无需移至回收站

时间:2019-03-28 19:55:11

标签: python google-colaboratory pydrive

我想立即删除从Google Colaboratory笔记本中保存的临时文件,而不必将其移到回收站。

我在我的脚本中使用Keras + Tensorflow,并在每次训练之后将其保存完整的模型。主要原因是,如果由于任何原因停止了脚本,我可以稍后重新启动它,它将以最近保存的模型读取并继续训练。为了节省磁盘空间(正在使用我的Google云端硬盘),我每次保存新模型时都会删除该模型的先前版本。我使用标准python os.remove()进行了此操作,只是后来发现由于os.remove我将Google云端硬盘完全填满,只是将文件移至“垃圾箱”文件夹而未真正删除它们。

我环顾四周,找到了对google colab API的引用,该引用说您必须调用文件对象的Delete方法。但是,仅使用文件名来获取对文件对象的引用似乎非常复杂。我认为我做的不正确。下面的代码是我想出的解决方法。有一条评论指出我必须用25行可读性差的代码替换单行代码。

我还应该说,我找到的文档始终表明,我应该能够使用“ name ='myfile'”之类的东西在一次对gdrive.ListFile的调用中找到该文件,但是无论何时尝试,我都会不断得到http查询错误。

!pip install -U -q PyDrive
import os
from google.colab import drive
drive.mount('/content/gdrive')
workdir = '/content/gdrive/My Drive/work/2019.03.26.trackingML/eff100_inverted'
os.chdir( workdir )

epoch = 170
fname = 'model_checkpoints/model_epoch%03d.h5' % (epoch)

#--------------------------------------------------------
# Everything below here is to replace the one line:
# os.remove(fname)

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials


auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
gdrive = GoogleDrive(gauth)

# File google colab file object based on path
fullpath = os.path.join(workdir, fname)
mydirs = fullpath.split('/')[3:]
curid = 'root'
for d in mydirs:
    file_list = gdrive.ListFile({'q': "'%s' in parents and trashed=false" % curid}).GetList()
    for file in file_list:
        if file['title'] == d:
          curid = file['id']
          break

if fname.endswith(file['title']):
  print('Found file %s with id %s' % (file['title'], file['id']))
  file.Delete()
else:
  print('Unable to find %s' % fname)

上面的代码几乎可以满足我的要求,但看起来又丑又肿。我希望有人可以指出os.remove()的1行或2行替换,以避免填满我的垃圾箱(和配额)。

1 个答案:

答案 0 :(得分:0)

假设您的检查点文件名以“ model_epoch”开头

1)在colab中,将这些语句写在开头的单元格中:

!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
# Authenticate and create the PyDrive client.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

2)转到驱动器,右键单击包含检查点文件的文件夹,然后选择Get shareable link。一个ID将被复制。

3)在colab中,将此功能写入单元格中。 def clearCheckPointFiles():

  file_list = drive.ListFile({'q': "'*******************' in parents and trashed=false"}).GetList()
  for i in range(np.size(file_list)):
    file_name = file_list[i]['title']
    if (file_name[0:11] == 'model_epoch'):
      drive.CreateFile({'id': file_list[i]['id']}).Delete()

4)在步骤2中,用复制的链接的id替换*****。

5)在保存新检查点之前致电clearCheckPointFiles()

6)尽情享受!