2012-06-26 36 views
1

我在使用python將字符串寫入文件時遇到問題: (我正在嘗試使用python生成一些C程序) 我的代碼如下:Python寫入文件丟失行

filename = "test.txt" 
i = 0 
string = "image" 
tempstr = "" 
average1 = "average" 
average2 = "average*average" 
output = "" 
FILE = open(filename,"w") 
while i < 20: 
    j = 0 
    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 

該打印給我正確的輸出,但FILE的最後一行丟失,第二行最後一行丟失。將字符串寫入文件有什麼問題?

謝謝!

+1

嘗試使用'with'語句...你不會有這些愚蠢的錯誤。 – JBernardo

+1

在我<20'的時候做''並且自己跟蹤計數器在Python中通常是不必要的 - 在範圍(20)中爲'i做':'爲同樣的效果。 – lvc

回答

6

也許幫助,如果你調用的方法...

FILE.close() 
+0

注意到你有FILE.close與FILE.close() –

+1

也注意到你需要FILE.close()的原因是因爲你必須刷新未寫入的數據緩衝區。 .write [lines]()實際上並不寫入文件,它寫入必須刷新到磁盤的文件緩衝區(在緩衝區已滿或關閉文件時發生刷新)。你也可以直接調用.flush(),雖然它可能是自動更好(沖洗太頻繁會傷害性能)。 –

+0

謝謝你的幫助!這非常有幫助! –

3

的問題是,你是不是調用close()方法,只是提到這一點在最後一行。你需要parens來調用一個函數。

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將被自動關閉。

+0

謝謝!我會在下一次做。 –

2

嘗試:

with open(filename,"w") as FILE: 
    while i < 20: 
     # rest of your code with proper indent... 

沒有接近需要...

0

看起來像你的壓痕可能是不正確的,但只是你的代碼的一些其他意見:

writelines()寫的內容列表或迭代器到文件。 由於您輸出的是單個字符串,只需使用write()即可。

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

或者只是:

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

至於另一個方面說明它可能有助於使用+=操作。

output += "more text" 
# is equivalent to 
output = output + "more text" 
1

首先,Pythonified版本的代碼:

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; 
+0

我沒有加速我的C代碼。我使用了一個非常專業的C編譯器,我可以使用的語法非常有限(數組索引中沒有變量,沒有函數調用,沒有指針..)這就是爲什麼我需要「手動」編寫一些代碼。但仍然感謝您的建議! –