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

时间:2018-01-26 16:41:20

标签: python-2.7 bigdata

大文本文件中总和数的最佳方法是什么? 文本文件将包含以逗号(',')分隔的数字 号码可以是任何类型 没有行或行限制。
例如:
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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

<强> input.csv

1,-2,-3.45-7.8j,99.6
-1,1-2j
1.5,2.5,1+1j

<强> example.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)