我已经成功上传了Google Cloud Storage
上的单个文本文件。但是当我尝试上传whole folder
时,它给出了denied error.
的权限
filename = "d:/foldername" #here test1 is the folder.
Error:
Traceback (most recent call last):
File "test1.py", line 142, in <module>
upload()
File "test1.py", line 106, in upload
media = MediaFileUpload(filename, chunksize=CHUNKSIZE, resumable=True)
File "D:\jatin\Project\GAE_django\GCS_test\oauth2client\util.py", line 132, in positional_wrapper
return wrapped(*args, **kwargs)
File "D:\jatin\Project\GAE_django\GCS_test\apiclient\http.py", line 422, in __init__
fd = open(self._filename, 'rb')
IOError: [Errno 13] Permission denied: 'd:/foldername'
9条答案
按热度按时间vhmi4jdf1#
这对我很有效。将本地目录中的所有内容复制到google云存储中的特定bucket-name/full-path(递归):
wwodge7n2#
一个没有递归函数的版本,它使用“顶级文件”(与顶级答案不同):
new9mtju3#
文件夹是一个包含文件和目录引用的编目结构。库不接受文件夹作为参数。
据我所知,您的用例是上传到GCS并保留本地文件夹结构。要实现这一点,您可以使用os python模块并创建一个递归函数(例如process_folder),该函数将路径作为参数。此逻辑可用于函数:
1.使用os.listdir()方法获取源路径中的对象列表(将同时返回文件和文件夹)。
1.通过os.path.isdir()方法迭代步骤1中的列表,将文件与文件夹分开。
1.迭代文件并使用调整后的路径(例如,路径+“/”+文件名)上传文件。
1.循环访问文件夹,进行递归调用(例如process_folder(path+folder_name))。
有必要使用两条路径:
1.与操作系统模块一起使用的真实的系统路径(例如“/Users/User/.../upload_folder/folder_name”)。
不要忘记实现[1]中提到的指数回退来处理500个错误。您可以使用[2]中的Drive SDK示例作为参考。
[1]- -https://developers.google.com/storage/docs/json_api/v1/how-tos/upload#exp-backoff
[2]- https://developers.google.com/drive/web/handle-errors
gstyhher4#
我假设纯粹的
filename = "D:\foldername"
是不是足够的信息,关于源代码。我也不确定这甚至是可能的。通过网络界面,你也可以只上传文件或创建文件夹,然后在那里上传文件。您可以保存文件夹名称,然后创建它(我从未使用过google-app-engine,但我想这应该是可能的),然后将内容上传到新文件夹
xriantvc5#
参考-https://hackersandslackers.com/manage-files-in-google-cloud-storage-with-python/
bbmckpt76#
该解决方案也可用于Windows系统。只需提供文件夹名称即可上载目标存储桶名称。此外,它还可以处理文件夹中的任何级别的子目录。
zqdjd7g97#
下面是我的递归实现。我们需要创建一个名为gdrive_utils.py的文件并编写以下代码。
然后使用以下命令
最后用这个
xqk2d5yq8#
我刚刚遇到了gcsfs库,它似乎也是关于更好的接口的
您可以将整个目录复制到gcs位置,如下所示:
gcxthw6b9#
另一个选择是使用
gsutils
,这是一个用于与Google Cloud交互的命令行工具:-r
标志告诉gsutils
递归复制。将gsutils
链接到文档。在Python中调用
gsutils
可以像这样完成: