Python:如何将旧的上传文件替换到 Google 驱动器
Python: How to replace old uploaded files to Google Drive
我在 python 中编写了这个脚本,它看起来像文件夹 'CSVtoGD',在那里列出每个 CSV,并将这些 CSV 作为独立的工作表发送到我的 google 驱动器。我正在尝试编写一行,当我再次 运行 程序时,它将删除旧文件。我在这里错过了什么?我试图通过使用来实现这一点:
sh = gc.del_spreadsheet(filename.split(".")[0]+" TTF")
不幸的是,脚本在添加此行后执行相同的操作。它正在上传新文件但不删除旧文件。
整个脚本看起来像这样
import gspread
import os
gc = gspread.oauth(credentials_filename='/users/user/credentials.json')
os.chdir('/users/user/CSVtoGD')
files = os.listdir()
for filename in files:
if filename.split(".")[1] == "csv":
folder_id = '19vrbvaeDqWcxFGwPV82APWYTmB'
sh = gc.del_spreadsheet(filename.split(".")[0]+" TTF")
sh = gc.create(filename.split(".")[0]+" TTF", folder_id)
content = open(filename, 'r').read().encode('utf-8')
gc.import_csv(sh.id, content)
一切正常,文件夹中的 CSV 已上传到 google 驱动器,我的问题是删除旧 CSV(与新 CSV 同名)
看gspread的文档,好像del_spreadsheet
方法的参数是文件ID。 Ref 当我看到你的脚本时,你正在使用文件名作为参数。我认为这可能是您遇到问题的原因。当这反映在您的脚本中时,它会变成如下。
发件人:
sh = gc.del_spreadsheet(filename.split(".")[0]+" TTF")
收件人:
sh = gc.del_spreadsheet(gc.open(filename.split(".")[0] + " TTF").id)
注:
- 当
filename.split(".")[0] + " TTF"
的文件名的电子表格不存在时,出现错误。请注意这一点。
参考:
已添加:
从您的回复中发现,我提出的修改可以用于“我的云端硬盘”。但是,这似乎不能用于共享驱动器。
当我再次看到gspread的脚本时,我发现当前请求无法使用文件名搜索共享驱动器中的文件。而且,我确认在当前的 gspread 中,无法使用 gspread 检索电子表格 ID。因为无法从所有共享驱动器中搜索文件。至此,我想提出以下修改脚本。
修改后的脚本:
import gspread
import os
from googleapiclient.discovery import build
gc = gspread.oauth(credentials_filename='/users/user/credentials.json')
service = build("drive", "v3", credentials=gc.auth)
def getSpreadsheetId(filename):
q = f"name='{filename}' and mimeType='application/vnd.google-apps.spreadsheet' and trashed=false" # or q = "name='" + filename + "' and mimeType='application/vnd.google-apps.spreadsheet' and trashed=false"
res = service.files().list(q=q, fields="files(id)", corpora="allDrives", includeItemsFromAllDrives=True, supportsAllDrives=True).execute()
items = res.get("files", [])
if not items:
print("No files found.")
exit()
return items[0]["id"]
os.chdir('/users/user/CSVtoGD')
files = os.listdir()
for filename in files:
fname = filename.split(".")
if fname[1] == "csv":
folder_id = '19vrbvaeDqWcxFGwPV82APWYTmB'
oldSpreadsheetId = getSpreadsheetId(fname[0] + " TTF")
sh = gc.del_spreadsheet(oldSpreadsheetId)
sh = gc.create(fname[0] + " TTF", folder_id)
content = open(filename, "r").read().encode("utf-8")
gc.import_csv(sh.id, content)
在此修改中,为了从共享驱动器中的文件名检索电子表格 ID,使用了 python 的 googleapis。 Ref
但是,在这种情况下,它假定您具有写入共享驱动器的权限。请注意这一点。
我在 python 中编写了这个脚本,它看起来像文件夹 'CSVtoGD',在那里列出每个 CSV,并将这些 CSV 作为独立的工作表发送到我的 google 驱动器。我正在尝试编写一行,当我再次 运行 程序时,它将删除旧文件。我在这里错过了什么?我试图通过使用来实现这一点:
sh = gc.del_spreadsheet(filename.split(".")[0]+" TTF")
不幸的是,脚本在添加此行后执行相同的操作。它正在上传新文件但不删除旧文件。
整个脚本看起来像这样
import gspread
import os
gc = gspread.oauth(credentials_filename='/users/user/credentials.json')
os.chdir('/users/user/CSVtoGD')
files = os.listdir()
for filename in files:
if filename.split(".")[1] == "csv":
folder_id = '19vrbvaeDqWcxFGwPV82APWYTmB'
sh = gc.del_spreadsheet(filename.split(".")[0]+" TTF")
sh = gc.create(filename.split(".")[0]+" TTF", folder_id)
content = open(filename, 'r').read().encode('utf-8')
gc.import_csv(sh.id, content)
一切正常,文件夹中的 CSV 已上传到 google 驱动器,我的问题是删除旧 CSV(与新 CSV 同名)
看gspread的文档,好像del_spreadsheet
方法的参数是文件ID。 Ref 当我看到你的脚本时,你正在使用文件名作为参数。我认为这可能是您遇到问题的原因。当这反映在您的脚本中时,它会变成如下。
发件人:
sh = gc.del_spreadsheet(filename.split(".")[0]+" TTF")
收件人:
sh = gc.del_spreadsheet(gc.open(filename.split(".")[0] + " TTF").id)
注:
- 当
filename.split(".")[0] + " TTF"
的文件名的电子表格不存在时,出现错误。请注意这一点。
参考:
已添加:
从您
当我再次看到gspread的脚本时,我发现当前请求无法使用文件名搜索共享驱动器中的文件。而且,我确认在当前的 gspread 中,无法使用 gspread 检索电子表格 ID。因为无法从所有共享驱动器中搜索文件。至此,我想提出以下修改脚本。
修改后的脚本:
import gspread
import os
from googleapiclient.discovery import build
gc = gspread.oauth(credentials_filename='/users/user/credentials.json')
service = build("drive", "v3", credentials=gc.auth)
def getSpreadsheetId(filename):
q = f"name='{filename}' and mimeType='application/vnd.google-apps.spreadsheet' and trashed=false" # or q = "name='" + filename + "' and mimeType='application/vnd.google-apps.spreadsheet' and trashed=false"
res = service.files().list(q=q, fields="files(id)", corpora="allDrives", includeItemsFromAllDrives=True, supportsAllDrives=True).execute()
items = res.get("files", [])
if not items:
print("No files found.")
exit()
return items[0]["id"]
os.chdir('/users/user/CSVtoGD')
files = os.listdir()
for filename in files:
fname = filename.split(".")
if fname[1] == "csv":
folder_id = '19vrbvaeDqWcxFGwPV82APWYTmB'
oldSpreadsheetId = getSpreadsheetId(fname[0] + " TTF")
sh = gc.del_spreadsheet(oldSpreadsheetId)
sh = gc.create(fname[0] + " TTF", folder_id)
content = open(filename, "r").read().encode("utf-8")
gc.import_csv(sh.id, content)
在此修改中,为了从共享驱动器中的文件名检索电子表格 ID,使用了 python 的 googleapis。 Ref
但是,在这种情况下,它假定您具有写入共享驱动器的权限。请注意这一点。