Python write()不会写完整文件

时间:2013-11-28 09:50:07

标签: python

由于某种原因,我无法弄清楚这只会在pi.txt文件中写入11571个字符 - 远远超过5万个应该是我一直在查找与磁盘IO有关的缓冲区,并尝试过os.fsync(fo)每10万次迭代,但同样的事情发生,实际上只有11571个字符记录在txt文件中 它似乎产生了所有5万个字符(计数状态最多可达50k) 这是我的代码,磁盘缓冲区或简单的问题,我完全失踪了。 这段代码来自这里:1000 digits of pi in python

我尝试过这个解决方案:Python not writing full string to file

完全相同的事情,记下文件的大小

我也尝试计算更长和更短的值,同样的问题。

import os
fo=open("pi.txt", "wb")
def make_pi():
    cnt = 1
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    for j in range(50000):
        if 4 * q + r - t < m * t:
            fo.write(str(m))
            yield m
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2
        if cnt % 1000 == 0:
            print("Count status: %s" % cnt)
        elif cnt % 10002 == 0:
            fo.flush()
            os.fsync(fo)
        else:
            pass
        cnt+=1
for i in make_pi():
    pass
fo.close()

另外,如果它有所作为我使用Windows 7 64位,我还没有在linux中尝试过这个。

这是固定代码,正常工作:)

fo=open("pi.txt", "wb")
def make_pi():
    cnt=0
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    while True:
        if 4 * q + r - t < m * t:
            if cnt % 1000 == 0:
                print("Counted %s places" % cnt)
            else:
                pass
            yield m
            fo.write(str(m))
            cnt+=1
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2

i = 0;
for x in make_pi():
    i += 1
    if i == 10001:
        break

fo.close()

感谢您指出:)

1 个答案:

答案 0 :(得分:3)

这是一个逻辑问题,而不是缓冲/光盘同步问题。如果条件:4 * q + r - t < m * t为TRUE,则该函数仅产生(并写入),在50K循环中仅为11571次。

只是因为......这里有一个稍微修改过的版本应该可以实现你想要做的事情:生成PI的前X位数:

fo=open("pi.txt", "wb")

def make_pi(num_digits):
    q, r, t, k, m, x = 1, 0, 1, 1, 3, 3
    j = 0
    while True:
        if 4 * q + r - t < m * t:
            fo.write(str(m))
            yield m
            q, r, t, k, m, x = 10*q, 10*(r-m*t), t, k, (10*(3*q+r))//t - 10*m, x
            j += 1
            if j % 1000 == 0:
                print("Count status: %s" % j)
        else:
            q, r, t, k, m, x = q*k, (2*q+r)*x, t*x, k+1, (q*(7*k+2)+r*x)//(t*x), x+2
        if j >= num_digits:
            break

for i in make_pi(50000):
    pass

fo.close()