def readmany(data, format="newick"): """Iterate over trees from a source.""" if type(data) in types.StringTypes: if os.path.isfile(data): data = open(data) else: data = StringIO(data) if format == "newick": for line in data: yield newick.parse(line) elif format == "nexus": for rec in newick.nexus_iter(data): yield rec.parse() else: raise Exception, "format '%s' not recognized" % format data.close()
def read(data, format=None, treename=None, ttable=None): """ Read a single tree from *data*, which can be a Newick string, a file name, or a file-like object with `tell` and 'read` methods. *treename* is an optional string that will be attached to all created nodes. Args: data: A file or file-like object or newick string Returns: Node: The root node. """ import newick StringTypes = types.StringTypes def strip(s): fname = os.path.split(s)[-1] head, tail = os.path.splitext(fname) tail = tail.lower() if tail in (".nwk", ".tre", ".tree", ".newick", ".nex"): return head else: return fname if (not format): if (type(data) in StringTypes) and os.path.isfile(data): s = data.lower() for tail in ".nex", ".nexus", ".tre": if s.endswith(tail): format="nexus" break if (not format): format = "newick" if format == "newick": if type(data) in StringTypes: if os.path.isfile(data): treename = strip(data) return newick.parse(file(data), treename=treename, ttable=ttable) else: return newick.parse(data, ttable=ttable) elif (hasattr(data, "tell") and hasattr(data, "read")): treename = strip(getattr(data, "name", None)) return newick.parse(data, treename=treename, ttable=ttable) elif format == "nexus-dendropy": import dendropy if type(data) in StringTypes: if os.path.isfile(data): treename = strip(data) return newick.parse( str(dendropy.Tree.get_from_path(data, "nexus")), treename=treename ) else: return newick.parse( str(dendropy.Tree.get_from_string(data, "nexus")) ) elif (hasattr(data, "tell") and hasattr(data, "read")): treename = strip(getattr(data, "name", None)) return newick.parse( str(dendropy.Tree.get_from_stream(data, "nexus")), treename=treename ) else: pass elif format == "nexus": if type(data) in StringTypes: if os.path.isfile(data): with open(data) as infile: rec = newick.nexus_iter(infile).next() if rec: return rec.parse() else: rec = newick.nexus_iter(StringIO(data)).next() if rec: return rec.parse() else: rec = newick.nexus_iter(data).next() if rec: return rec.parse() else: # implement other tree formats here (nexus, nexml etc.) raise IOError, "format '%s' not implemented yet" % format raise IOError, "unable to read tree from '%s'" % data