[Tutor] Remove last newline only in print / open / read function

Dave Angel davea at davea.name
Fri Apr 25 12:14:31 CEST 2014


Chris <ch2009 at arcor.de> Wrote in message:
> Hi,
> 
> I'm a Python Newbie. Probably, this is a simple question.

But what is your context? Your Python version (apparently 2.x,
 since you're using print as a statement, rather than a function)?
 What os, and what is stdout pointing to,  since you're pretending
 that you can write binary data to it?


> 
> I've a function that offers a ZIP-file for download:
> 
> def download_cert(form, config):
>    cn     = form['cn'].value
>    serial = pki.util.serial_from_cn(config, cn)
>    files  = pki.util.cert_files(config, cn, serial, True)
>    try:
>       name = path.join(tempfile.mkdtemp(), cn + '.zip')
>       zip  = zipfile.ZipFile(name, 'w')
>       for file in files:
>          zip.write(file, path.basename(file))
>       zip.close() (1)
>    except:
>       pki.cgi.start_html('Internal error', True)
>       pki.cgi.show_error(str(sys.exc_info()[1]))
>       pki.cgi.show_link('Go Back')
>       pki.cgi.end_html()
>    else:
>       print 'Content-Type: application/zip'
>       print 'Content-Disposition: attachment;filename=' + cn + '.zip'
>       print
>       print open(name).read() (2)

print adds a newline.  Use write () instead. 
         sys.stdout.write (open (name).read ())

This assumes stdout is opened in binary mode,  so that bytes that
 happen to look like a newline are not corrupted.
 

>       os.remove(name)
>       os.rmdir(path.dirname(name))
> 
> The ZIP file on the server is okay (1), but when it's sent to the client
> (2), there's a linefeed in the last line. This makes the zip invalid. So
> how can I remove the last linefeed only?
> 

Minimum change is to add a comma at the end of the print
 statement.  But I'd prefer write method,  to be parallel with the
 read ().

Do you know that memory is not a problem,  since you're reading
 the entire temp file in before writing any of it to stdout?  If
 you're not sure,  replace this with a loop.


-- 
DaveA



More information about the Tutor mailing list