如何从谷歌云存储中读取子目录/前缀中的文件?

Posted

技术标签:

【中文标题】如何从谷歌云存储中读取子目录/前缀中的文件?【英文标题】:How do I read files in a subdirectory/prefix from google cloud storage? 【发布时间】:2020-03-30 12:47:47 【问题描述】:

我已将文件和文件夹移至谷歌云存储 (GCS)。我发现很难理解 GCS 文档中的前缀和分隔符。

我想要做的基本上是用 GCS 位置替换本地存储文件的路径/位置。例如

目前为本地路径编码:

Variable = "C:\\Users\\admin\\Documents\\Folder1\\doc3.csv"

我需要编写它来在 GCS 中搜索文件,如下所示:

Variable = "https://storage.cloud.google.com/MYBUCKETNAME/Folder1/doc3.csv?supportedpurview=project"

这显然行不通,但我有以下代码连接到存储桶,但我正在努力将其定向到特定文件。

from google.cloud import storage
import os
client = storage.Client()
bucket = client.bucket('mybucketname')
blobs = bucket.list_blobs(prefix='Folder1')
for blob in blobs:
    print(blob.name)

因此,它的输出会在该特定文件夹中提供以下文件:

doc1.csv
doc2.csv
doc3.csv

对于我的变量,我应该写什么作为 doc3.csv 的文件路径。这就是我正在努力解决的问题。

【问题讨论】:

您要检查文件夹的内容吗?还是下载一个文件夹? 好吧,我现在的问题是我不知道如何将变量“MonthlyCount”指向存储桶中的 .csv 文件。 .csv 文件位于存储桶内的子文件夹中,例如mybucketname/folder1/count.csv。我设法解决了我的第一个问题,即将我的目录指向正确的路径,即home_dir = client.bucket('mybucketname') data_dir = home_dir.list_blobs(prefix='Reference Data') 你能补充更多细节吗?你的输入文件是什么?您还需要输出回 Cloud Storage,还是直​​接从中读取? @DustinIngram 我已经再次写出了我上面的查询,希望这能说清楚! 【参考方案1】:

您不能像本地文件一样通过名称来引用 Cloud Storage 中的 blob。您需要先将文件从 Cloud Storage 传输到本地文件系统:

destination_file_name = ...
blob.download_to_filename(destination_file_name)

然后您可以从本地存储文件的位置读取文件:

with open(destination_file_name) as f:
   contents = f.read()

...或者像文件系统上的任何其他本地文件一样使用它。

更多详情请见https://cloud.google.com/storage/docs/downloading-objects。

【讨论】:

所以没有办法直接从 GCS 读取文件,我必须先在本地下载它?如果有办法,我宁愿不要下载它并直接从 GCS 阅读。 正确。即使您可以“直接从 GCS 读取”,它仍然需要将文件中的数据从 GCS 传输到您的脚本运行的任何位置,因此没有太大区别。

以上是关于如何从谷歌云存储中读取子目录/前缀中的文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从谷歌云存储中的多个文件中删除扩展名?

使用node.js中的firebase从谷歌云存储读取时,ESlint问题“每个都应该返回一个值或抛出”

如何从谷歌云存储中批量删除文件? (Node.js)

从谷歌云存储中的 csv 加载数据作为 bigquery 'in' 查询

如何使用 gsutil 通过 http 链接从谷歌云存储下载到 AWS 实例或 s3 存储桶?

如何在谷歌大查询中从谷歌云存储上传表格