1

我使用 pandas 以以下样式从 s3 上传和下载文件(pandas 在后台使用 s3fs)

import pandas as pd
pd.read_csv("s3://bucket/path/to/file.csv")

如果文件很大,通常会担心下载(或上传)不完整并且处理了部分文件。

我需要在这里执行一些 md5 检查以确保数据的完整性吗?或者它已经被 s3fs 处理了?

4

1 回答 1

0

简而言之,是的。通常,当人们将大量数据上传到外部存储桶时,他们会提供带有数据的 md5sum,但不幸的是,情况并非总是如此。如果不验证 md5sum,您将无法知道数据是否已从存储桶更改到您的本地计算机。s3fs 有一个校验和方法,我编写了一个小自定义函数来获取字符串的 md5,这样您就可以在 s3 中验证文件对象的 md5,然后在本地读取后计算 md5,如下所示:

import pandas as pd
import io
from hashlib import md5
from s3fs import S3FileSystem

fs = S3FileSystem(anon=False)
checksum = fs.checksum('s3://fun_bucket/check_df.csv')
print("S3FS checksum is: %i" %checksum)

def tokenize(mystr):
    new_str = ""
    for c in mystr.decode():
        new_str += c
    return md5(str(new_str).encode()).hexdigest()


with fs.open('s3://sjcb/check_df.csv') as f:
    data = f.read()
    hash_checksum = int(tokenize(data), 16)
    print("Read data checksum is: %i" %hash_checksum)
    if checksum == hash_checksum:
        df = pd.read_csv(io.BytesIO(data), encoding='utf8')

print(df)

当我运行它时,我得到:

S3FS checksum is: 185552205801727997486039422858559195205
Read data checksum is: 185552205801727997486039422858559195205
   one  two  three
0    1    2      3
1    1    2      3
2    1    2      3

这会打印校验和供您手动检查,但显然如果它们不相等,条件将不会生成 df。

于 2020-09-04T15:10:12.290 回答