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