gpt4 book ai didi

python,寻找,讲述,阅读。从巨大的 csv 文件中读取行

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

我有一个巨大的特征向量文件(1.2GB),保存为 csv 文件。为了遍历这些行,我创建了一个 python 类,该类将批量行从巨型文件加载到内存中,一次一批。

为了让这个类知道在文件中到底从哪里读取以获得一批batch_size完整行(假设batch_size = 10,000),在第一次使用巨型文件时,这个类会遍历整个文件一次,并注册每行的偏移量,并将这些偏移量保存到帮助文件中,以便稍后可以“file.seek(starting_offset);batch = file.read(num_bytes)”读取下一批行。

首先,我通过这种方式实现了线偏移的注册:

    offset = 0;
line_offsets = [];
for line in self.fid:
line_offsets.append(offset);
offset += len(line);

它与 Giant_file1 配合得很好。

但是后来我在我制作的这个类的帮助下处理了这些特征并创建了giant_file2(具有标准化特征)。接下来,当我想从 Giant_file2 读取批量行时,它失败了,因为它读取的批处理字符串不在正确的位置(例如,读取类似“-00\n15.467e-04,...”的内容) ”而不是“15.467e-04,...\n”)。

所以我尝试将线偏移计算部分更改为:

    offset = 0;
line_offsets = [];
while True:
line = self.fid.readline();

if (len(line) <= 0):
break;

line_offsets.append(offset);
offset = self.fid.tell();

主要的变化是我注册的偏移量是从 fid.tell() 的结果中获取的,而不是行的累积长度。

此版本在 Giant_file2 上运行良好,但在 Giant_file1 上失败。

随着我进一步研究,我感觉函数eek()、tell() 和read() 彼此不一致。例如:

fid = file('giant_file1.csv');
fid.readline();
>>>'0.089,169.039,10.375,-30.838,59.171,-50.867,13.968,1.599,-26.718,0.507,-8.967,-8.736,\n'
fid.tell();
>>>67L
fid.readline();
>>>'15.375,91.43,15.754,-147.691,54.234,54.478,-0.435,32.364,4.64,29.479,4.835,-16.697,\n'
fid.seek(67);
fid.tell();
>>>67L
fid.readline();
>>>'507,-8.967,-8.736,\n'

这里有一些矛盾:当我定位(根据 fid.tell())在字节 67 时,一旦读取行是一回事,而第二次(再次当 fid.tell() 报告我是位于字节 67) 读取的行不同。

我不能相信tell()和seek()会将我置于所需的位置以从所需行的开头读取。另一方面,当我使用(使用giant_file1)字符串的长度作为seek()的引用时,我得到了正确的位置:

fid.seek(0);
line = fid.readline();
fid.tell();
>>>87L
len(line);
>>>86
fid.seek(86);
fid.readline();
>>>'15.375,91.43,15.754,-147.691,54.234,54.478,-0.435,32.364,4.64,29.479,4.835,-16.697,\n'

那么这是怎么回事?

我能想到的giant_file1和giant_file2之间的唯一区别是,在giant_file1中,值是用小数点写入的(例如-0.435),而在giant_file2中,它们都是科学格式的(例如-4.350e-01)。我不认为它们中的任何一个都是用 unicode 编码的(我认为是这样,因为我用简单的 file.read() 读取的字符串似乎是可读的。我如何确定?)。

非常感谢您的帮助,包括解释、原因想法以及可能的解决方案(或解决方法)。

谢谢你,尤纳坦。

最佳答案

我认为您遇到了换行问题。检查giant_file1.csv是否以\n或\r\n结尾。如果以文本模式打开文件,文件将仅返回以\n结尾的行,并丢弃多余的\r。因此,当您查看返回的行的长度时,它将比实际文件位置减 1(这不仅消耗了\n,还消耗了\r\n)。当然,随着您阅读更多行,这些错误将会累积。

解决方案是以二进制模式打开文件。在这种模式下,没有\r\n ->\n 减少,因此您的行长度计数将与您的文件tell( ) 查询保持一致。

我希望能够为您解决这个问题 - 因为这是一个简单的解决方法。 :) 祝您的项目顺利,编码愉快!

关于python,寻找,讲述,阅读。从巨大的 csv 文件中读取行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036603/

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