【问题标题】:create file of particular size in python在python中创建特定大小的文件
【发布时间】:2012-01-11 08:09:24
【问题描述】:

我想创建一个特定大小的文件(比如 1GiB)。 内容不重要,我会往里面填。

我正在做的是:

f = open("E:\\sample", "wb")
size = 1073741824 # bytes in 1 GiB
f.write("\0" * size)

但这需要很长时间才能完成。它花了我大约 1 分钟。 可以做些什么来改善这一点?

【问题讨论】:

  • 1 分钟听起来和我觉得差不多。顺便说一句,你到底在用这个文件做什么?
  • 1073741824 字节!= 1GB。使用 SSD 而不是机械硬盘?写入本地磁盘而不是网络共享?
  • @onemach 1 GB = 10^9 B. 1 GiB = 2^30 B.
  • @glglgl:鉴于很少有人使用 gibibyte 作为术语,可能是因为它听起来很荒谬(包括许多使用 base-2 GB 而不是 base-10 GB 进行汇总的文件系统显示),得到关于 GiB 的迂腐就是:迂腐。硬盘制造商使用 base-10 来宣传更大的尺寸;几乎没有人这样做。

标签: python file


【解决方案1】:

警告 此解决方案会产生您可能无法预料的结果。见 UPD ...

1 创建新文件。

2 寻找大小为 1 字节。

3 写入 1 个字节。

4 利润 :)

f = open('newfile',"wb")
f.seek(1073741824-1)
f.write(b"\0")
f.close()
import os
os.stat("newfile").st_size

1073741824

统一更新: 查找和截断都在我的系统(Linux + ReiserFS)上创建稀疏文件。它们具有所需的大小,但实际上不会占用存储设备上的空间。所以这不是快速空间分配的正确解决方案。我刚刚创建了 100Gib 文件,只有 25Gib 可用,结果仍然有 25Gib 可用。

小更新:f.write("\0") 添加了 b 前缀,以实现 Py3 兼容性。

【讨论】:

  • 如果您的系统支持,truncate() 解决方案可能 - 严格来说 - 更好,因为这里的解决方案虽然没有必要,但会为此文件消耗 1 个分配块。
  • 这不会生成稀疏文件吗? (这可能是需要的,但并不完全相同)
  • 在 python 3 中是f.write(b"\0")
  • 从文件大小枚举的角度来看,它适用于 MacOS High Sierra,即使它不会影响整个系统大小。非常适合为大文件编写测试,这正是我正在做的 :)
【解决方案2】:

之前的问题是answered。不确定该解决方案是否是跨平台的,但它可以在 Windows(NTFS 文件系统)中完美运行。

with open("file.to.create", "wb") as out:
    out.truncate(1024 * 1024 * 1024)

This answer 使用seekwrite

with open("file.to.create", "wb") as out:
    out.seek((1024 * 1024 * 1024) - 1)
    out.write('\0')

【讨论】:

  • Docs: 请注意,如果指定的大小超过文件的当前大小,则结果取决于平台:可能包括文件可能保持不变,增加到指定的大小,好像为零- 填充,或使用未定义的新内容增加到指定大小。
  • @JanneKarila 在这种情况下file.to.create 是一个空文件,所以指定的大小总是会超过文件的当前大小?
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2015-11-15
相关资源
最近更新 更多