gpt4 book ai didi

python - 转换文本 CSV 二进制文件并在 Python 中从中获取随机行,而不将其读入内存

转载 作者:行者123 更新时间:2023-12-01 05:55:24 24 4
gpt4 key购买 nike

我有一些格式为 CSV 文本文件:

1.3, 0, 1.0
20.0, 3.2, 0
30.5, 5.0, 5.2

这些文件大小约为 3.5Gb,我无法在有效的时间内将它们读入 Pandas 的内存中。

但我不需要读取所有文件,因为我想做的是从文件中选择一些随机行并读取其中的值,而且我知道如果文件是,理论上可以做到这一点以所有字段都具有相同大小的方式进行格式化 - 例如,二进制文件中的 float16。

现在,我想我可以使用问题答案中指定的 NumPy 方法来转换它: How to output list of floats to a binary file in Python

但是,转换完成后如何从中随机选取一条线?

在普通的文本文件中,我可以这样做:

import random
offset = random.randrange(filesize)
f = open('really_big_file')
f.seek(offset) #go to random position
f.readline() # discard - bound to be partial line
random_line = f.readline() # bingo!

但我找不到在 NumPy 生成的二进制文件中使用它的方法。

最佳答案

我会使用struct 转换为二进制:

import struct
with open('input.txt') as fin, open('output.txt','wb') as fout:
for line in fin:
#You could also use `csv` if you're not lazy like me ...
out_line = struct.pack('3f',*(float(x) for x in line.split(',')))
fout.write(out_line)

在大多数系统上,这会将所有内容写入标准 4 字节 float 。

现在,再次读取数据:

with open('output.txt','rb') as fin:
line_size = 12 #each line is 12 bytes long (3 floats, 4 bytes each)
offset = random.randrange(filesize//line_size) #pick n'th line randomly
f.seek(offset*line_size) #seek to position of n'th line
three_floats_bytes = f.read(line_size)
three_floats = struct.unpack('3f',three_floats_bytes)

如果您担心磁盘空间并希望使用np.float16(2字节浮点)压缩数据,您也可以使用上面的基本框架来做到这一点,只需替换np.fromstring 用于 struct.unpackndarray.tostring 代替 struct.pack (使用适当的数据类型当然是 ndarray ——而 line_size 会下降到 6 ...)。

关于python - 转换文本 CSV 二进制文件并在 Python 中从中获取随机行,而不将其读入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com