This is a test version of Biostars. For the public version, visit https://www.biostars.org.
BioPython write combined nexus files

I'm trying to concatenate nexus files using BioPython as documented in this page here.

It seems to create the objects just fine but fails to write the actual file - without any error.

from Bio.Nexus import Nexus

file_list = ['T591_1.nex','T591_2.nex']
nexi =  [(fname, Nexus.Nexus(fname)) for fname in file_list]

combined = Nexus.combine(nexi)
combined.write_nexus_data(filename=open('btCOMBINED.nex', 'w'))

combined

<Bio.Nexus.Nexus.Nexus object at 0x103a49b20>

I searched for the combined.write_nexus_data() function but it appears to not exist anymore? When I try using

write_nexus_data()

instead I get the error: NameError: name 'write_nexus_data' is not defined.

Any help would be greatly appreciated. I don't know python and this is my first attempt to use BioPython.

biopython nexus

Please use the formatting bar (especially the code option) to present your post better. You can use backticks for inline code (`text` becomes text), or select a chunk of text and use the highlighted button to format it as a code block. I've done it for you this time.
code_formatting

Did combined.write_nexis_data() threw an error? Was the file created? It might be in a directory you don't expect it to be in, try giving it an absolute path maybe.

No file created in the working directory and no error thrown.

Okay, I tried also using write_nexus_data(filename=open('btCOMBINED.nex', 'w')) but then got that error which I am unsure how I am using the command wrong.

2 answers

Can you specify what versions of python and biopython you are using?

I've just attempted to run the documented examples, with their example files as at: https://biopython.org/wiki/Concatenate_nexus

It works fine for me on Python 3.7.3 and BioPython 1.74:

Downloading test data:

$ curl https://biopython.org/examples/btCOI.nex > btCOI.nex
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   151  100   151    0     0   2745      0 --:--:-- --:--:-- --:--:--  2745

$ curl https://biopython.org/examples/btCOII.nex > btCOII.nex
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   151  100   151    0     0    766      0 --:--:-- --:--:-- --:--:--   762

$ curl https://biopython.org/examples/btITS.nex > btITS.nex
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   151  100   151    0     0   1078      0 --:--:-- --:--:-- --:--:--  1086

In python:

$ python
Python 3.7.3 | packaged by conda-forge | (default, Jul  1 2019, 21:52:21)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> from Bio.Nexus import Nexus
>>> file_list = ['btCOI.nex', 'btCOII.nex', 'btITS.nex']
>>> nexi =  [(fname, Nexus.Nexus(fname)) for fname in file_list]
>>> combined = Nexus.combine(nexi)
>>> combined.write_nexus_data(filename=open('btCOMBINED.nex', 'w'))
<_io.TextIOWrapper name='btCOMBINED.nex' mode='w' encoding='UTF-8'>

>>> [x for x in os.listdir() if x.endswith("nex")]
[''btCOMBINED.nex', 'btCOI.nex', 'btCOII.nex', 'btITS.nex']
>>> exit()

Check file:

$ cat btCOMBINED.nex
#NEXUS
begin data;
    dimensions ntax=4 nchar=32;
    format datatype=dna missing=? gap=-;
matrix
bt1 GGGGGGGGGGGGAAAAAAAAAAAA-TTTTTTT
bt2 GGGGGGGGGGGGAAAAAAAAAAAA-TTTTTTT
bt3 GGGGGGGGGGGGAAAAAAAAAAAA-TTTTTTT
bt4 ????????????????????????-TTTTTTT
;
end;

begin sets;
charset btCOI.nex = 1-12;
charset btCOII.nex = 13-24;
charset btITS.nex = 25-32;
charpartition combined = btCOI.nex: 1-12, btCOII.nex: 13-24, btITS.nex: 25-32;
end;

Okay, thanks. I'm using Python 3.8.3 (called by python3 since I also have a legacy version) and Biopython 1.77. I don't get a file to write using the sample data either. Do I need to use <_io.TextIOWrapper name='btCOMBINED.nex' mode='w' encoding='UTF-8'>? It errors when I try to add that.

No, that's not a code line, it's just the printed output of the previous command showing a description of the Nexus object.

Do you have all the necessary permissions to create and modify files in the directory you're working in?

Have you tried their example files? Perhaps there's some issue combining your specific data.

I stated above - don't get a file to write using the sample data either. I do have permissions to write to my directory. Thanks anyway.

If this is a genuine bug, it must have come in in the subsequent releases. You could try either downgrading your biopython to 1.74 and give that a go, or post a bug report at the biopython github issues page (they have a template for providing all the necessary information).

I'm afraid I'm out of ideas!

I couldn't figure out how to get this to work so I used another program for the same task instead: Sequence Matrix .

Log in to answer this question.