【问题标题】:Is it possible to use readlines with boto3?是否可以将 readlines 与 boto3 一起使用?
【发布时间】:2018-01-17 17:30:18
【问题描述】:

我正在尝试对存储在 S3 中的两个文件进行比较,并希望尽可能避免下载这些文件。

我正在使用的示例代码如下:

import difflib

file1 = open('sample1.csv', 'r');
file2 = open('sample2.csv', 'r');

diff = difflib.ndiff(file1.readlines(), file2.readlines())

我看到使用 boto3 包,我可以从 S3 打开文件,但是如何将 file1.readlines() 和 file2.readlines() 的等价物传递给 ndiff 函数?

【问题讨论】:

  • 获取字符串并在换行符处拆分?
  • 不涉及存储在内存中吗?我担心的是当文件为 5GB 时,如果我尝试构建自己的行数组以输入 difflib,我将无法运行 diff。
  • 是的,但.readlines也是如此
  • Annnd 查看difflib 文档并进行了一些实验,似乎需要字符串列表。好吧,至少有 __len__ 的东西,您可能可以对其进行猴子补丁,但如果它按照文档假定为 list,它可能需要列表上可用的其他方法,而这些方法并不那么容易鸭型到一个惰性迭代。

标签: python amazon-s3


【解决方案1】:

对于未来的读者,我将回答确切的问题“是否可以将 readlines 与 boto3 一起使用?”

import io

// import stuff and set up s3_client

body = s3_client.get_object(Bucket=bucket, Key=key)['Body']
stream = io.BufferedReader(body._raw_stream)
stream.readlines()

正如问题中的 cmets 所指出的,readlines() 将所有内容都拉入内存,这就是为什么您可以向它传递一个提示,以便“如果所有行的总大小(以字节/字符为单位),则不会再读取更多行远远超过暗示。” (https://docs.python.org/2/library/io.html#io.IOBase.readlines)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    • 2019-03-18
    • 2014-03-15
    • 2021-03-31
    相关资源
    最近更新 更多