如何只读取python中字符串列表的一部分

我需要找到一种方法,能够从包含字符串的列表中读取x字节的数据.列表中的每个项目大约为36MB.我需要能够遍历列表中的每个项目,但一次只能抓取大约1KB的项目.

基本上它看起来像这样:

for item in list:
    #grab part of item
    #do something with that part
    #Move onto next part, until you've gone through the whole item

我当前的代码(哪种工作,但似乎相当缓慢和低效)是这样的:

for character in bucket:
    print character
    packet = "".join(character)
    if(len(packet.encode("utf8")) >= packetSizeBytes):
        print "Bytes: " + str(len(packet.encode("utf8")))
        return packet

我想知道是否存在类似f.read(bufSize)的东西,但是对于字符串.

不确定它是否相关,但对于更多上下文,这就是我正在做的事情:

我正在从一个非常大的文件(几GB)中读取数据到更小的(更易于管理的块).我使用f.read(chunkSize)对文件进行分块,然后将它们存储为存储桶但是,即使这些存储桶仍然太大而不能用于我最终需要处理的数据,所以我想一次只抓取部分存储桶.

最初,我绕过了整个桶的东西,只是把文件分成了足够小的块,以满足我的需要.然而,这导致我不得不将文件数十万次,这有点慢.我现在的希望是能够排队等待,所以当我用一个桶做某事时,我可以开始从别人那里读书.如果任何一个听起来令人困惑,请告诉我,我会尽力澄清.

谢谢

最佳答案 如果您使用str(或python 3中的字节),则每个字符都是一个字节,因此f.read(5)与f [:5]相同.如果你只想要列表中每个字符串的前5个字节,你可以这样做

[s[:5] for s in buckets]

但请注意,这是复制所有这些字符串.在读取数据时,只需要获取所需的数据,而不是创建一堆中间列表,然后将该数据发送到另一个线程来处理它并继续读取文件,这将是更高效的内存.

import threading

def worker(chunk):
    # do stuff with chunk
    ...

def main():
    with open('file', 'r') as f:
        bucket = f.read(500)
        while bucket:
            chunk = bucket[:5]
            thread = threading.Thread(target=worker, args=(chunk,))
            thread.start()
            bucket = f.read(500)
点赞