output = "square_sum = square_sum + " while j < 20: tempstr = string + "_" + str(i) + "_" + str(j) output = output + tempstr + "*" + tempstr + " + " + average2 + " - 2*" + average1 + "*" + tempstr if j != 19: output = output + " + " if j == 19: output = output + ";" j = j + 1 output = output + "\n" i = i + 1 print(output) FILE.writelines(output) FILE.close

print给了我正确的输出,但FILE的最后一行不见了,倒数第二行的一些内容也不见了。在将字符串写入文件时有什么问题?

2 个评论
尝试使用 with 语句...你就不会有这些愚蠢的错误了。
lvc
在Python中,做 while i < 20 并自己跟踪计数器通常是不必要的--做 for i in range(20): 有同样的效果。
python
python-3.x
Ken Ma
Ken Ma
发布于 2012-06-26
5 个回答
Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams
发布于 2012-06-26
已采纳
0 人赞同

如果你调用这个方法,可能会有帮助...

FILE.close()
    
Mark
还要注意的是,你需要FILE.close()的原因是你必须刷新未写入的数据缓冲区。.write[lines]()实际上并不是写到一个文件,而是写到一个必须被刷新到磁盘的文件缓冲区(刷新发生在缓冲区满的时候,或者你关闭文件的时候)。你也可以直接调用.flush(),尽管让它自动进行可能更好(刷新太频繁会损害性能)。
谢谢你的帮助!这很有帮助!
谢谢你的帮助,但我想知道为什么不调用这个方法就会发生这个问题?
Ned Batchelder
Ned Batchelder
发布于 2012-06-26
0 人赞同

问题是你并没有调用 close() 方法,只是在最后一行提到了它。 你需要用圆括号来调用一个函数。

不过Python的 with 语句可以使之成为不必要的。

with open(filename,"w") as the_file:
    while i < 20:
        j = 0
        output = "square_sum = square_sum + "
        print(output)
        the_file.writelines(output)

with子句被退出时,the_file将被自动关闭。

谢谢!我下次会这样做的。
user648852
发布于 2012-06-26
0 人赞同
with open(filename,"w") as FILE:
    while i < 20:
        # rest of your code with proper indent...

no close needed...

Hugh Bothwell
Hugh Bothwell
发布于 2012-06-26
0 人赞同

首先,你的代码的Python化版本。

img = 'image_{i}_{j}'
avg = 'average'
clause = '{img}*{img} + {avg}*{avg} - 2*{avg}*{img}'.format(img=img, avg=avg)
clauses = (clause.format(i=i, j=j) for i in xrange(20) for j in xrange(20))
joinstr = '\n    + '
output = 'square_sum = {};'.format(joinstr.join(clauses))
fname = 'output.c'
with open(fname, 'w') as outf:
    print output
    outf.write(output)

第二,看起来你希望通过狂热的内联来加速你的C代码。我非常怀疑速度的提高是否能证明你的努力是正确的,比如说

maxi = 20;
maxj = 20;
sum = 0;
sqsum = 0;
for(i=0; i<maxi; i++)
    for(j=0; j<maxj; j++) {
        t = image[i][j];
        sum += t;
        sqsum += t*t;
square_sum = sqsum + maxi*maxj*average*average - 2*sum*average;
    
我没有加快我的C代码的速度。我使用的是一个非常专业的C语言编译器,我可以使用的语法非常有限(没有数组索引中的变量,没有函数调用,没有指针......)这就是为什么我需要 "手动 "编写一些代码。但还是要感谢你的建议!
monkut
monkut
发布于 2012-06-26
0 人赞同

看起来你的缩进可能不正确,但只是对你的代码的一些其他评论。

writelines() 将一个列表或迭代器的内容写入文件。 因为你输出的是一个字符串,所以只需使用 write()

lines ["lineone\n", "line two\n"]
f = open("myfile.txt", "w")
f.writelines(lines)
f.close()

Or just:

output = "big long string\nOf something important\n"
f = open("myfile.txt", "w")
f.write(output)
f.close()

作为另一个附带说明,使用+=运算符也许有帮助。