【问题标题】:Python write() doesn't write full filePython write() 不写入完整文件
【发布时间】:2013-11-28 09:50:07
【问题描述】:

由于某种原因,我无法弄清楚这只会在 pi.txt 文件中写入 11571 个字符 - 远低于 50,000 个字符,我应该一直在查找与磁盘 IO 相关的缓冲区,并尝试过os.fsync(fo) 每1万次迭代,但是同样的事情发生了,txt文件中实际只记录了11571个字符 它似乎正在生成所有 50,000 个字符(计数状态最多为 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()

感谢您指出这一点:)

【问题讨论】:

  • if 4 * q + r - t &lt; m * t: 声明总是正确的吗?

标签: python


【解决方案1】:

这是一个逻辑问题,而不是缓冲/光盘同步问题。该函数仅在条件:4 * q + r - t &lt; 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()

【讨论】:

  • 我不敢相信我错过了...我已经在这里待了大约 2 个小时
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多