def writeEdgeList(grph, name, extraInfo = True, allSameAttribute = False, _progBar = None):
    """Writes an edge list of _grph_ at the destination _name_.

    The edge list has two columns for the source and destination of the edge, `'From'` and `'To'` respectively, then, if _edgeInfo_ is `True`, for each attribute of the node another column is created.

    **Note**: If any edges are missing an attribute it will be left blank by default, enable _allSameAttribute_ to cause a `KeyError` to be raised.

    # Parameters

    _grph_ : `networkx Graph`

    > The graph to be written to _name_

    _name_ : `str`

    > The name of the file to be written

    _edgeInfo_ : `optional [bool]`

    > Default `True`, if `True` the attributes of each edge will be written

    _allSameAttribute_ : `optional [bool]`

    > Default `False`, if `True` all the edges must have the same attributes or an exception will be raised. If `False` the missing attributes will be left blank.
    """
    count = 0
    eMax = len(grph.edges())
    if metaknowledge.VERBOSE_MODE or isinstance(_progBar, _ProgressBar):
        if isinstance(_progBar, _ProgressBar):
            PBar = _progBar
            PBar.updateVal(0, "Writing edge list {}".format(name))
        else:
            PBar = _ProgressBar(0, "Writing edge list {}".format(name))
    else:
        PBar = _ProgressBar(0, "Writing edge list {}".format(name), dummy = True)
    if len(grph.edges(data = True)) < 1:
        outFile = open(os.path.expanduser(os.path.abspath(name)), 'w')
        outFile.write('"From","To"\n')
        outFile.close()
        PBar.updateVal(1, "Done edge list '{}', 0 edges written.".format(name))
    else:
        if extraInfo:
            csvHeader = []
            if allSameAttribute:
                csvHeader = ['From'] +  ['To'] + list(grph.edges(data = True).__next__()[2].keys())
            else:
                extraAttribs = set()
                for eTuple in grph.edges(data = True):
                    count += 1
                    if count % 1000 == 0:
                        PBar.updateVal(count / eMax * .10, "Checking over edge: '{}' to '{}'".format(eTuple[0], eTuple[1]))
                    s = set(eTuple[2].keys()) - extraAttribs
                    if len(s) > 0:
                        for i in s:
                            extraAttribs.add(i)
                csvHeader = ['From', 'To'] + list(extraAttribs)
        else:
            csvHeader = ['From'] +  ['To']
        count = 0
        PBar.updateVal(.01, "Opening file {}".format(name))
        f = open(os.path.expanduser(os.path.abspath(name)), 'w', newline = '')
        outFile = csv.DictWriter(f, csvHeader, delimiter = ',', quotechar = '"', quoting=csv.QUOTE_NONNUMERIC)
        outFile.writeheader()
        if extraInfo:
            for e in grph.edges(data = True):
                count += 1
                if count % 1000 == 0:
                    PBar.updateVal(count / eMax * .90 + .10, "Writing edge: '{}' to '{}'".format(e[0], e[1]))
                eDict = e[2].copy()
                eDict['From'] = e[0]
                eDict['To'] = e[1]
                try:
                    outFile.writerow(eDict)
                except UnicodeEncodeError:
                    #Because Windows
                    newDict = {k.encode('ASCII', errors='ignore').decode('ASCII', errors='ignore') if isinstance(k, str) else k: v.encode('ASCII', errors='ignore').decode('ASCII', errors='ignore') if isinstance(v, str) else v for k, v in eDict.items()}
                    outFile.writerow(newDict)
                except ValueError:
                    raise ValueError("Some edges in The graph do not have the same attributes")
        else:
            for e in grph.edges():
                count += 1
                if count % 1000 == 0:
                    PBar.updateVal(count / eMax * .90 + .10, "Writing edge: '{}' to '{}'".format(e[0], e[1]))
                eDict['From'] = e[0]
                eDict['To'] = e[1]
                try:
                    outFile.writerow(eDict)
                except UnicodeEncodeError:
                    #Because Windows
                    newDict = {k.encode('ASCII', errors='ignore').decode('ASCII', errors='ignore') if isinstance(k, str) else k: v.encode('ASCII', errors='ignore').decode('ASCII', errors='ignore') if isinstance(v, str) else v for k, v in eDict.items()}
                    outFile.writerow(newDict)
        PBar.updateVal(1, "Closing {}".format(name))
        f.close()
        if not isinstance(_progBar, _ProgressBar):
            PBar.finish("Done edge list {}, {} edges written.".format(name, count))
Writes an edge list of _grph_ at the destination _name_.

    The edge list has two columns for the source and destination of the edge, `'From'` and `'To'` respectively, then, if _edgeInfo_ is `True`, for each attribute of the node another column is created.

    **Note**: If any edges are missing an attribute it will be left blank by default, enable _allSameAttribute_ to cause a `KeyError` to be raised.

    # Parameters

    _grph_ : `networkx Graph`

    > The graph to be written to _name_

    _name_ : `str`

    > The name of the file to be written

    _edgeInfo_ : `optional [bool]`

    > Default `True`, if `True` the attributes of each edge will be written

    _allSameAttribute_ : `optional [bool]`

    > Default `False`, if `True` all the edges must have the same attributes or an exception will be raised. If `False` the missing attributes will be left blank.