首页 > 编程问答 >如何使用 Google Drive API 识别和删除大型 Google Takeout ZIP 文件?

如何使用 Google Drive API 识别和删除大型 Google Takeout ZIP 文件?

时间:2024-07-24 16:34:15浏览次数:10  
标签:google-chrome python zip

如何使用 Google Drive API 识别和删除大型 Google Takeout ZIP 文件?

正文: 我遇到一个问题:Google Takeout 不断在我的 Google 云端硬盘中创建大型 ZIP 文件,导致其达到存储限制。我需要使用 Google Drive API 以编程方式识别和删除这些文件。

我注意到文件名遵循类似 takeout-YYYYMMDDTHHMMSSZ-###.zip 的模式,并且我想要:

列出所有文件在我的谷歌云端硬盘中。 识别与模式 takeout-*.zip 匹配的文件。 删除已识别的文件以释放空间。 以下是我到目前为止所做的事情:

我已经设置了一个 Google Cloud 项目并启用了 Google Drive API。 我有服务帐户凭据并且可以通过 API 进行身份验证。 有人可以提供执行上述步骤的 Python 示例脚本吗?任何有关有效处理大量文件的其他提示也将不胜感激。

我所拥有的: Python 复制代码

from google.oauth2 import service_account
from googleapiclient.discovery import build

# Define the scope
SCOPES = ['https://www.googleapis.com/auth/drive']

# Provide the path to your service account key file
SERVICE_ACCOUNT_FILE = 'path/to/service_account.json'

credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

# Create the Drive API service
service = build('drive', 'v3', credentials=credentials)

# List all files
results = service.files().list(
    pageSize=1000, fields="nextPageToken, files(id, name, size, modifiedTime)").execute()
items = results.get('files', [])

if not items:
    print('No files found.')
else:
    print('Files:')
    for item in items:
        print(f'{item["name"]} ({item["id"]}) - {item["modifiedTime"]} - {item["size"]}')

# Optionally, delete old files based on a condition
for item in items:
    if 'takeout' in item['name']:
        # Add your condition to delete older files
        service.files().delete(fileId=item['id']).execute()
        print(f'Deleted {item["name"]}')

问题:
如何修改此脚本以有效地识别和仅删除 takeout-*.zip 文件?
处理大量文件时我应该考虑哪些优化或最佳实践?


from google.oauth2 import service_account
from googleapiclient.discovery import build
import re

# Define the scope
SCOPES = ['https://www.googleapis.com/auth/drive']

# Provide the path to your service account key file
SERVICE_ACCOUNT_FILE = 'path/to/service_account.json'

credentials = service_account.Credentials.from_service_account_file(
    SERVICE_ACCOUNT_FILE, scopes=SCOPES)

# Create the Drive API service
service = build('drive', 'v3', credentials=credentials)

def list_and_delete_takeout_files():
    """Lists and deletes Google Takeout files matching the pattern 'takeout-*.zip'.
    """

    page_token = None
    while True:
        # Use pageToken to retrieve large amounts of files
        results = service.files().list(
            pageSize=1000, 
            fields="nextPageToken, files(id, name, size, modifiedTime)",
            pageToken=page_token
        ).execute()
        items = results.get('files', [])

        if not items:
            print('No files found.')
            break

        for item in items:
            # Use regex for more robust pattern matching
            if re.match(r'takeout-.*\.zip$', item['name']):
                print(f'Deleting: {item["name"]} ({item["id"]})')
                try:
                    service.files().delete(fileId=item['id']).execute()
                except Exception as e:
                    print(f'Error deleting file {item["name"]}: {e}')

        page_token = results.get('nextPageToken')
        if not page_token:
            break

if __name__ == '__main__':
    list_and_delete_takeout_files()

改进和注意事项:

  • 正则表达式匹配: 使用 re.match(r'takeout-.*\.zip$', item['name']) 来更准确地匹配文件名模式,确保只删除 takeout-*.zip 文件。
  • 分页: 使用 pageToken 处理可能超过单页限制 (1000) 的大量文件。
  • 错误处理: 包含 try-except 块以捕获删除文件时可能发生的任何错误,防止脚本中断。
  • 删除确认 (可选): 为了安全起见,可以添加一个确认步骤,要求用户在删除每个文件之前进行确认。
  • 条件性删除 (可选): 可以根据修改日期、文件大小或其他条件添加逻辑来进一步筛选要删除的文件。

最佳实践:

  • 增量删除: 如果文件数量非常多,可以考虑分批删除,例如每天删除一部分,以避免 API 调用过于频繁。
  • 日志记录: 记录已删除的文件以及任何错误信息,以便于跟踪和调试。
  • 测试: 在生产环境中运行脚本之前,请务必先在测试环境中对其进行彻底测试。
  • API 配额: 请注意 Google Drive API 的使用限制,并确保的脚本不会超出这些限制。

通过这些改进,可以更有效、安全地使用 Google Drive API 识别和删除大型 Google Takeout ZIP 文件。

标签:google-chrome,python,zip
From: 78787191

相关文章

  • Python 的分布式锁管理器
    我有一堆具有多个实例的服务器,这些实例访问的资源对每秒的请求有硬性限制。我需要一种机制来锁定所有正在运行的服务器和实例对此资源的访问。有我在github上找到的一个restful分布式锁管理器:https://github.com/thefab/restful-distributed-lock-manager不幸......
  • 如何在Python中提示self变量的类型
    通常不需要关心Python类成员函数中的self变量,但我正在实现一个装饰器,看起来像defextractor(depends:List[Text]=None,provides:List[Text]=None)->Callable[[ExtractorFunction],Extracto......
  • 将 Python 类型提示限制为元组中的值
    我的方法之一采用status中使用的filter()参数。此参数与定义如下的模型字段相关:STATUS_CHOICES=((1,_("draft")),(2,_("private")),(3,_("published")),)classMyModel(Model):status=models.PositiveSmallIntegerFi......
  • 在python中查找区间数据的中位数
    我正在探索不同的python库,我想知道如何找到分组数据集的近似中值。这里有一个表格供参考。年龄频率1-1012310-203502......
  • 比较Python中的字符串统一特殊字符
    也许我可以使用更好的英语,但我想要的是忽略单词中的重音(和类似的),所以:renè、rené、rene'和rene应该是相同的,所以应该mañana和manana或even-distribuited和evendistribuited,可能还有sho......
  • 如何使用 Python 脚本从客户账单电子邮件中获取订单 ID - WooCommerce API
    我想创建一个python脚本,返回只知道客户的账单电子邮件的订单。我尝试这样做,但返回所有最近的订单:fromwoocommerceimportAPIwcapi=API(url="https://siteexample.com",consumer_key="ck_xxx",consumer_secret="cs_xxx",version="wc/v3")......
  • python基础理论小总结
    1.python语言的特性Python是一门解释型语言,简单清晰,开源免费,跨平台,有大量第三方库辅助开发,支持面向对象与自动垃圾回收,方便与其他编程语言相互调用。Python在数据采集、人工智能、WEB后台开发、自动化运维、测试等方向应用广泛。2.解释型语言和编译型语言的区别执行方式不......
  • python编码规范
    本篇讲的是代码格式化的问题,解决格式化的方法在最下方,不想看内容的,滑到最下方就好了。一、变量的命名规则1.组成:字母、数字、下划线2.不可以以数字开头3.不建议使用下划线开头4.命名需见名知意5.不要与关键字重名。如何查找所有关键字?importkeywordprint(keyword.k......
  • Python爬虫开发中的常用库与框架安装指南
    在Python爬虫开发中,选择合适的库和框架可以大大提高开发效率和爬虫的性能。本文将介绍一些常用的解析库、请求库、储存库、Web库、App爬取库以及爬虫框架,并展示如何使用pip命令进行安装。一、解析库1.BeautifulSoupBeautifulSoup是一个用于从HTML或XML文件中提取数据的Pyth......
  • 如何在Python中的指定项目之后添加新项目到嵌套列表?
    给定的列表是这样的。list1=[10,20,[300,400,[5000,6000],500],30,40]预期输出是这样的。我知道这是一个非常基本的问题,但我很困惑。输出:[10,20,[300,400,[5000,6000,7000],500],30,40]我希望有人能帮助我解决这个问题。并解释了嵌套列表的插入功......