Ken Ma
Ken Ma

Reputation: 309

Python Write To File Missing Lines

I'm having trouble using python to write strings into a file: (what I'm trying to do is using python to generate some C programs) The code I have is the following:

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

The print gives me correct output, but the FILE has last line missing and some of the second last line missing. What's the problem in writing strings into file?

Thank you!

Upvotes: 2

Views: 6698

Answers (5)

Hugh Bothwell
Hugh Bothwell

Reputation: 56634

First, a Pythonified version of your code:

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)

Second, it looks like you are hoping to speed up your C code by fanatical inlining. I very much doubt the speed gains will justify your efforts over something like

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;

Upvotes: 1

monkut
monkut

Reputation: 43832

Looks like your indentation may be incorrect, but just some other comments about your code:

writelines() writes the content of a list or iterator to the file. Since your outputting a single string, just use 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()

As another side note it maybe helpful to use the += operator.

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

Upvotes: 0

user648852
user648852

Reputation:

Try:

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

no close needed...

Upvotes: 2

Ned Batchelder
Ned Batchelder

Reputation: 375564

The problem is that you aren't calling the close() method, just mentioning it in the last line. You need parens to invoke a function.

Python's with statement can make that unnecessary though:

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

When the with clause is exited, the_file will be closed automatically.

Upvotes: 3

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798576

Probably help if you called the method...

FILE.close()

Upvotes: 7

Related Questions