[Biopython-dev] [Biopython - Bug #3382] (New) Bio.PDB.PDBList.retrieve_pdb_file() fails for Python3

redmine at redmine.open-bio.org redmine at redmine.open-bio.org
Tue Sep 4 23:19:53 EDT 2012


Issue #3382 has been reported by Alexander Campbell.

----------------------------------------
Bug #3382: Bio.PDB.PDBList.retrieve_pdb_file() fails for Python3
https://redmine.open-bio.org/issues/3382

Author: Alexander Campbell
Status: New
Priority: Normal
Assignee: 
Category: 
Target version: 
URL: 


At present, calling @Bio.PDB.PDBList.retrieve_pdb_file()@ on any PDB ID will fail, giving the following traceback:
<pre>
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-4ecf112b58e0> in <module>()
----> 1 pdbl.retrieve_pdb_file('1FAT')

/usr/lib64/python3.2/site-packages/Bio/PDB/PDBList.py in retrieve_pdb_file(self, pdb_code, obsolete, compression, uncompress, pdir)
    245         gz = gzip.open(filename, 'rb')
    246         out = open(final_file, 'wb')
--> 247         out.writelines(gz.read())
    248         gz.close()
    249         out.close()

TypeError: 'int' does not support the buffer interface
</pre>

This occurs because in Python3 a file opened in binary mode will return type @bytes@ for @read()@, or a list of type @bytes@ objects for @readlines()@. The @writelines()@ method expects an iterable where each element is of type @str at . This worked in Python2 as a @str@ can be viewed as a sequence of @str@ objects, and so line 247 effectively wrote one character at a time for the single @str@ yielded by @read()@. In Python3 iterating over a @bytes@ yields @int@ objects, leading to the TypeError.

This issue can be fixed by changing line 247's call to @writelines()@ to just @write()@. This does not break functionality in Python2, according to my testing with Python 3.2.3 and 2.7.3 on Fedora 17.

There are 4 more instances of @writelines()@ calls in the codebase, but in each of those cases the argument is a list or generator of @str@ or @bytes@ objects, as I don't think they will raise an error. I haven't tested them though.




----------------------------------------
You have received this notification because this email was added to the New Issue Alert plugin


-- 
You have received this notification because you have either subscribed to it, or are involved in it.
To change your notification preferences, please click here and login: http://redmine.open-bio.org



More information about the Biopython-dev mailing list