如何以块的形式写入文件以规避大文件大小的错误?

Posted

技术标签:

【中文标题】如何以块的形式写入文件以规避大文件大小的错误?【英文标题】:How do I write to file in blocks in order to circumvent an error with large file sizes? 【发布时间】:2019-06-20 13:07:58 【问题描述】:

我有这段非常简单的代码:

f = open('file.txt','w+')
f.write(result)
f.close()

问题在于字符串“result”的大小可能高达数 GB。虽然创建成功,但是写入文件会导致这个错误:

OSError: [Errno 22] Invalid argument

我了解到这是在 OS X 中运行 Python 的一个已知问题(我正在运行 10.13 High Sierra)。如何将 write 函数分解成块以绕过它?

(我也知道这在 32 位版本中由于固有的限制是一个无法克服的问题,但我运行的是 64 位)

【问题讨论】:

你要写入哪个文件系统? 【参考方案1】:

尝试分块书写

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]


with open('file.txt','w+') as f:  
    for chunk in chunks(results, 1024):  # try to play with this number
        f.write(chunk)

【讨论】:

这行得通!但是,请注意,您在倒数第二行末尾错过了一个冒号。请注意查看此线程的其他人:这会减慢较小字符串的写入时间。但是,它可能是唯一成功编写较大字体的方法。【参考方案2】:

如果问题真的是内存不足,可以尝试逐行追加。

with open('output.txt', 'a') as f:
    for item in result:
        f.write(item)

在这种情况下,result 是行列表。您应该根据 result 对象的内容来调整它。

【讨论】:

以上是关于如何以块的形式写入文件以规避大文件大小的错误?的主要内容,如果未能解决你的问题,请参考以下文章

Java套接字在写入字节数组后仅获得NUL字符

如何在python中拆分一个巨大的文本文件

如何在C中逐字节或分块写入()到文件

.net core web api - 如何以块的形式返回表结果

如何使用 JSONStream 对大对象进行字符串化

有没有办法以块的形式划分和运行testng测试而不是全套