如何附加二进制文件?

时间:2014-04-28 07:07:07

标签: python python-3.x

这个问题涉及项目欧拉,问题10:总结低于200万的所有素数。在我使用正确的算法之前,程序非常慢,所以我决定将它找到的素数分批写入数据文件。现在我有正确的主算法,但原则上我想知道如何附加数据文件。

#Project Euler 10a: list primes below 2,000,000.

import pickle

def numprime(x):
    for i in range(2, int(x**0.5)+1):
        if x % i == 0:
            return False
    else:
        return True

def growfile(primes, faccess):
    file = open('primelist2kk.dat', faccess)
    pickle.dump(primes, file)
    file.close()

def main(fchunk, faccess):
    #File input broken up for memory
    for i in range(10):
        plist = []
        for j in range(1, fchunk, 2):
            k = fchunk*i + j
            if numprime(k):
                plist.append(k)
        if i == 0:
            plist.pop(0)
            plist.insert(0,2)
        print()
        print(plist)
        growfile(plist, faccess)

def viewfile(faccess):
    g = open('primelist2kk.dat', faccess)  
    h = pickle.load(g)
    g.close()
    print(h)
    g.closed


#Supply 1/10 of the prime upper bound
#main(200, 'ab')
viewfile('rb')

我已经尝试了我能想到的文件访问代码的每个不同的合理组合,但没有任何作用。后续数据块可以删除第一个数据块,也可以根本不保存。有什么想法吗?

NB Unhash main()创建文件并显示程序输出。哈希main()和unhash viewfile()来查看文件。

2 个答案:

答案 0 :(得分:2)

您需要使用追加模式(ab)更新文件,但这还不够。 pickle.dump写的每个二进制数据块都是独立的。当您为打开的文件执行pickle.load时,您将只获得第一个。你需要做一个循环并继续加载数据,直到不再剩下。

def viewfile():
    with open('primelist2kk.dat', 'rb') as g:
        try:
            while True: # run until there's an exception
                h = pickle.load(g)
                print(h)
        except EOFError: # this will be raised by load() when there's no more data
            pass

如果您不希望每个夹头单独打印,您可以将它们组合在一个列表中。

答案 1 :(得分:0)

您需要追加模式。即

faccess = 'ab'

除此之外:Sieve_of_Eratosthenes是生成这些素数的更快方法

筛子的例子

N = range(2000000)
P = []
for i in N:
    if i > 1:
        P.append(i)
        N[::i] = [0]*((len(N)+i-1)//i)

print P