所以我试图从Google驱动器下载很多不同的文件,然后将它们组合成更少的文件。但是,由于某种原因,我的代码正在下载重复文件,或者可能只是错误地读取了BytesIO对象。我在下面粘贴了代码,这只是文件结构的简要说明。
所以我有〜135个文件夹,每个文件夹包含52个文件。我的目标是循环浏览每个文件夹,下载52个文件,然后将这52个文件转换为压缩程度更高的文件(摆脱不必要/重复的数据)。
代码
def main(temporary_workspace, workspace):
store = file.Storage('tokenRead.json')
big_list_of_file_ids = []
creds = store.get()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
creds = tools.run_flow(flow, store)
service = build('drive', 'v3', http=creds.authorize(Http()))
# Call the Drive v3 API
results = service.files().list(
q="'MAIN_FOLDER_WITH_SUBFOLDERS_ID' in parents",
pageSize=1000, fields="nextPageToken, files(id, name)").execute()
items = results.get('files', [])
list_of_folders_and_ids = []
if not items:
raise RuntimeError('No files found.')
else:
for item in items:
list_of_folders_and_ids.append((item['name'], item['id']))
list_of_folders_and_ids.sort(key=lambda x: x[0])
for folder_id in list_of_folders_and_ids:
start_date = folder_id[0][:-3]
id = folder_id[1]
print('Folder: ', start_date, ', ID: ', id)
query_string = "'{}' in parents".format(id)
results = service.files().list(
q=query_string, fields="nextPageToken, files(id, name)"
).execute()
items = results.get('files', [])
list_of_files_and_ids = []
if not items:
raise RuntimeError('No files found.')
else:
for item in items:
list_of_files_and_ids.append((item['name'], item['id']))
for file_id in list_of_files_and_ids:
# Downloading the files
if file_id[1] not in big_list_of_file_ids:
big_list_of_file_ids.append(file_id[1])
else:
print('Duplicate file ID!')
exit()
print('\tFile: ', file_id[0], ', ID: ', file_id[1])
request = service.files().get_media(fileId=file_id[1])
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print("Download: {}".format(int(status.progress() * 100)))
fh.seek(0)
temporary_location = os.path.join(tmp_workspace, file_id[0])
with open(temporary_location, 'wb') as out:
out.write(fh.read())
fh.close()
convert_all_netcdf(temporary_workspace, start_date, workspace, r'Qout_south_america_continental',
num_of_rivids=62317)
os.system('rm -rf %s/*' % tmp_workspace)
因此,如您所见,我首先获取所有文件夹的ID,然后遍历每个文件夹并获取该文件夹中的52个文件,然后将所有52个文件保存到一个临时文件夹中,并将其转换放入一个文件,我将其保存在另一个目录中,然后删除所有52个文件,然后移至Google云端硬盘中的下一个文件夹。问题是,当我比较使用 convert_all_netcdf 方法压缩的文件时,它们都是相同的。我觉得我在 BytesIO 对象上做错了什么,我需要做更多的事情来清除它吗?也可能是我每次在Google驱动器api调用中不小心从同一文件夹中读取。任何帮助表示赞赏。
答案 0 :(得分:0)
我意识到这可能不是一个好问题,主要是因为我认为BytesIO对象做错了什么,但我找到了答案。我正在读取通过Xarray库下载的所有文件,却忘记了关闭连接。这使我只能在后续循环中读取第一个连接,从而给我重复的内容。感谢任何尝试过的人!