Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 在大文本文件中求和的最佳方法是什么?_Python 2.7_Bigdata - Fatal编程技术网

Python 2.7 在大文本文件中求和的最佳方法是什么?

Python 2.7 在大文本文件中求和的最佳方法是什么?,python-2.7,bigdata,Python 2.7,Bigdata,在大文本文件中求和的最佳方式是什么? 文本文件将包含以逗号(“,”)分隔的数字。 号码可以是任何类型。 没有行或行限制 例如: 1,-2,-3.45-7.8j,99.6,… … … 输入:文本文件的路径 输出:数字的总和 我试着自己写一个解决方案,想知道更好的解决方案: 这是我的尝试: 我处理的是数据块,而不是逐行读取,因为数据块的末尾可能包含一些数字(只有-2而不是-2+3j),所以我只查看“安全块”,最后一个逗号(“,”),另一部分保存为下一个数据块 import re CHUNK_SI

在大文本文件中求和的最佳方式是什么?
文本文件将包含以逗号(“,”)分隔的数字。
号码可以是任何类型。
没有行或行限制
例如:
1,-2,-3.45-7.8j,99.6,…



输入:文本文件的路径
输出:数字的总和

我试着自己写一个解决方案,想知道更好的解决方案:

这是我的尝试: 我处理的是数据块,而不是逐行读取,因为数据块的末尾可能包含一些数字(只有-2而不是-2+3j),所以我只查看“安全块”,最后一个逗号(“,”),另一部分保存为下一个数据块

import re
CHUNK_SIZE = 1017


def calculate_sum(file_path):
    _sum = 0
    with open(file_path, 'r') as _f:
        chunk = _f.read(CHUNK_SIZE)
        while chunk:
            chunk = chunk.replace(' ', '')
            safe_piece = chunk.rfind(',')
            next_chunk = chunk[safe_piece:] if safe_piece != 0 else ''
            if safe_piece != 0:
                chunk = chunk[:safe_piece]
            _sum += sum(map(complex, re.findall(r"[+-]\d*\.?\d*[+-]?\d*\.?\d*j|[+-]?\d+(?:\.\d+)?", chunk)))
            chunk = next_chunk + _f.read(CHUNK_SIZE)
        return _sum

谢谢

这将在文本文件中添加任意数量的数字。例如:

input.csv

1,-2,-3.45-7.8j,99.6
-1,1-2j
1.5,2.5,1+1j
示例.py

import csv

with open('input.txt','rb') as f:
    r = csv.reader(f)
    total = 0
    for line in r:
        total += sum(complex(col) for col in line)

print total
输出

(100.15-8.8j)
如果您有很长的行,并且没有足够的内存一次性读取,那么您可以使用缓冲类来分块读取,并使用生成器函数将数字从缓冲区中分离出来:

import re

class Buffer:

    def __init__(self,filename,chunksize=4096):
        self.filename = filename
        self.chunksize = chunksize
        self.buf = ''

    def __iter__(self):
        with open(self.filename) as f:
            while True:
                if ',' in self.buf or '\n' in self.buf:
                    data,self.buf = re.split(r',|\n',self.buf,1) # split off the text up to the first separator
                    yield complex(data)
                else:
                    chunk = f.read(self.chunksize)
                    if not chunk: # if no more data to read, return the remaining buffer and exit function
                        if self.buf:
                            yield complex(self.buf)
                        return
                    self.buf += chunk

total = 0
for num in Buffer('input.txt'):
    total += num
print total
输出:

(100.15-8.8j)

不完全按照这个描述。请阅读指南并提供一个工作示例,其中包含示例输入和预期输出与实际输出。我添加了预期输入和输出,谢谢。@MarkTolonen为什么要加负数?缺少什么?“文本文件路径”没有描述输入。输入文件的内容是什么?提供一个真实的例子。“数字摘要”不是输出。这个摘要应该是什么样子的?您的代码没有打印任何内容。@MarkTolonen,你好,朋友,谢谢您的回答,我的问题已编辑完毕。添加文件的内容,并从摘要更改为总和。我真的希望它现在更清楚了…但是如果所有的文件都是一行呢?(文件大小>20G)@Naor88那么这个要求应该在问题中。它就在那里。。。“无行或行限制”是一个不错的解决方案!当我在两者之间进行测量时,我看不到更好的时间性能。@Naor88我不追求效率,它肯定可以改进<例如,中的code>每次扫描缓冲区以查找
\n
。如果这个解决方案对你有用,考虑一下投票和/或接受答案。