Boto3上传到S3:从.csv文件中删除最后几行数据

gajydyqb  于 2023-06-19  发布在  其他
关注(0)|答案(4)|浏览(137)

当我使用boto3(Python)上传一个.csv文件时,最后几行数据被切断了。文件的大小为268KB,对于非多部分上传来说不应该太大。下面是我的代码:

import boto3 
s3 = boto3.client('s3') 
s3 = boto3.resource('s3')
s3.meta.client.upload_file(report_file.name, 'raw-data-bucket', 'Reports/report.csv')
  • 这些不是我使用的确切的桶和路径,但在这种情况下它们应该是无关紧要的

任何帮助将不胜感激。

cwtwac6a

cwtwac6a1#

在使用.upload_file()之前,您是否关闭了要上传到S3的文件?我在上传 *.CSV文件时也遇到了同样的问题,通过在上传之前显式关闭每个文件来解决这个问题,问题就解决了。不再有截断的 *.CSV文件。

kuuvgm7e

kuuvgm7e2#

看来这个人也有同样的问题
256kb stackoverflow similar problem
此外,他们在这里提供了boto3中的多个uplod部分

uqzxnwby

uqzxnwby3#

坚持使用一个服务(资源或客户端)。

# Using boto3 service client
import boto3 
s3 = boto3.client('s3') 
s3.upload_file('your_local_file_path", 'bucket_name', 'prefix_filename_to_s3')

对于服务资源

import boto3 
s3 = boto3.resource('s3')
s3.Object('bucket_name', 'you_local_file_path').upload_file('prefix_filename_to_s3')

再次检查“report_file. name”的内容。S3.upload_file作为GIGO(垃圾进垃圾出)工作,它不会截断数据。
(更新)经过进一步检查,there is another case,我不确定它们是否相关。建议httppretty模块boto3的使用不是线程安全的,你应该更新你的boto3版本并禁用线程。

from boto3.s3.transfer import TransferConfig
    config = TransferConfig(use_threads=False)
    client.download_file(Bucket="mybucket",
      Key="foo/bar.fastq.gz", Filename="bar.fastq.gz", Config=config)
m528fe3b

m528fe3b4#

我遇到这个问题是因为我在关闭文件句柄之前执行上传。由于其他人建议先关闭文件,然后上传修复了这个问题。
这导致上传的文件丢失了最后一个块。

import boto3
client = boto3.client("s3")
data = {...}
with open("file.json", "w") as f:
    json.dump(data, f)
    client.upload_file("file.json", "my-bucket", "some/prefix/file.json")

这解决了我的问题:

import boto3
client = boto3.client("s3")
data = {...}
with open("file.json", "w") as f:
    json.dump(data, f)
client.upload_file("file.json", "my-bucket", "some/prefix/file.json")

相关问题