例如,假设我想搜索我的 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。
您似乎遇到了 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 的配额和限制。