首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中读入大数据

在python中读入大数据
EN

Stack Overflow用户
提问于 2013-02-21 07:59:42
回答 3查看 1.1K关注 0票数 1

所以我尝试用python读入一个大的数据文件。如果数据有一列和一百万行,我会这样做:

代码语言:javascript
运行
复制
fp = open(ifile,'r');

for row in fp:  
    process row

当我读入的数据有一百万列,只有一行时,我的问题就出现了。我想要的是一个与C中的fscanf()函数类似的功能。

也就是说,

代码语言:javascript
运行
复制
while not EOF:  
    part_row = read_next(%lf)  
    work on part_row

如果我知道格式是long float或其他什么,我可以使用fp.read(%lf)

有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2013-02-21 08:06:21

文本格式的一百万个浮点数真的不是很大...因此,除非它被证明是某种瓶颈,否则我不会担心它,只需这样做:

代码语言:javascript
运行
复制
with open('file') as fin:
    my_data = [process_line(word) for word in fin.read().split()]

一种可能的替代方法(假设以空格分隔的“单词”)类似于:

代码语言:javascript
运行
复制
import mmap, re

with open('whatever.txt') as fin:
    mf = mmap.mmap(fin.fileno(), 0, access=mmap.ACCESS_READ)
    for word in re.finditer(r'(.*?)\s', mf):
        print word.group(1)

这将扫描整个文件,并有效地提供大量的字流,而不管行/列。

票数 3
EN

Stack Overflow用户

发布于 2013-02-21 08:14:23

有两种基本的方法来解决这个问题:

首先,您可以使用自己的显式缓冲区编写read_column函数,或者将其作为生成器函数:

代码语言:javascript
运行
复制
def column_reader(fp):
    buf = ''
    while True:
        col_and_buf = self.buf.split(',', 1)
        while len(col_and_buf) == 1:
            buf += fp.read(4096)
            col_and_buf = buf.split(',', 1)
        col, buf = col_and_buf
        yield col

…或者作为一个类:

代码语言:javascript
运行
复制
class ColumnReader(object):
    def __init__(self, fp):
        self.fp, self.buf = fp, ''
    def next(self):
        col_and_buf = self.buf.split(',', 1)
        while len(col_and_buf) == 1:
            self.buf += self.fp.read(4096)
            col_and_buf = self.buf.split(',', 1)
        self.buf = buf
        return col

但是,如果您编写了一个在内部处理缓冲的read_until函数,那么您可以这样做:

代码语言:javascript
运行
复制
next_col = read_until(fp, ',')[:-1]

在ActiveState上有多个read_until食谱。

或者,如果你mmap这个文件,你实际上是免费得到的。您可以将该文件视为一个巨大的字符串,并对其使用find (或正则表达式)。(这假设整个文件都适合您的虚拟地址空间--在64位Python构建中可能不是问题,但在32位构建中可能会有问题。)

显然,这些都是不完整的。它们不处理EOF或换行符(在现实生活中,您可能有6行百万列,而不是1行,对吧?),但这应该足以说明问题。

票数 1
EN

Stack Overflow用户

发布于 2013-02-21 08:08:16

您可以使用yield来完成此任务。

代码语言:javascript
运行
复制
def read_in_chunks(file_object, chunk_size=1024):
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data


f = open('your_file.txt')
for piece in read_in_chunks(f):
    process_data(piece)

有关更多示例,请查看this question

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14992248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档