如何从谷歌云存储中读取子目录/前缀中的文件?
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问题“每个都应该返回一个值或抛出”
从谷歌云存储中的 csv 加载数据作为 bigquery 'in' 查询