使用 Python 在 GCS 的 3 个项目内、特定字段内、多个 csv 文件内、多个存储桶内搜索特定值

问题描述 投票:0回答:1

例如,假设我想搜索我的 3 个项目 > 许多存储桶 > 许多 csv 文件 > 包含“名称”的字段 > 查找值“Bob”。到目前为止我有以下代码:

import io
import pandas as pd
from google.cloud import storage

for project_id in ("project-1", "project-2", "project-3"):
    
    client = storage.Client(project=project_id)
    buckets = client.list_buckets()

    for bucket in buckets:
        blobs = client.list_blobs(bucket)

        for blob in blobs:
            if blob.name.endswith('.csv'):
                csv = blob.download_as_text()
                df = pd.read_csv(io.StringIO(csv), low_memory=False)
                
                for col in df.columns:
                    #finds fields that include 'name'
                    if 'name' in col.lower():
                        
                        name_found = df[df[col].str.contains('Bob', case=False, na=False)]

                        if name_found:
                            num_found.append(blob.name)

    if name_found:
        print(f"{len(num_found)} of Bob found in {bucket}. CSV Files are:")
        print(f"{num_found}")  
    else:
        print(f"No Bobs found in {bucket}!")

到目前为止,当我处理尝试解码“utf-8”的数据时,此代码会中断,因为它是“无效的起始字节”。另一个问题是 Cloudshell 无法运行超过 20 个存储桶,它会自行终止(由于内存不足?),所以我目前正在使用 VScode IDE。

python csv google-cloud-storage blob bucket
1个回答
0
投票

您似乎遇到了 unicode 解码错误。您可以做的就是尝试使用相同的编码方案解码您的 csv 文件。

csv = blob.download_as_text(encoding='utf-8')

如果您不确定文件使用的编码类型,可以使用

chardet
来检测 csv 文件的编码类型。

正如这篇 StackOverflow 帖子中提到的,您可以使用

errors='replace'
但请注意,您会丢失一些字符,因为这只会替换无法解码的字符(通常是 �)。

for blob in blobs:
        if blob.name.endswith('.csv'):
            try:
                csv_bytes = blob.download_as_bytes()
                csv = csv_bytes.decode(errors='replace')

另一个原因是 csv 文件包含一些无法解码的非 ASCII 字符。

我尝试使用一个项目重新创建您的问题,并上传了一些 csv 文件,其中包括一个损坏的文件(强制将 .xlsx 文件保存到 .csv),并且我在损坏的文件上收到了相同的“无效起始字节”错误。也许尝试检查您的存储桶是否有损坏的 .csv 文件。

至于使用 Cloud Shell 时的限制,跨 3 个项目搜索多个存储桶中的多个文件可能会耗尽 cloudshell,从而可能导致某些错误。您可以详细了解 Cloud Shell 的配额和限制

© www.soinside.com 2019 - 2024. All rights reserved.