-
-
Save arudmin/52aec759a8c5d7543e36 to your computer and use it in GitHub Desktop.
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
import os | |
import re | |
from lxml import etree | |
import StringIO | |
import sys | |
reload(sys) | |
sys.setdefaultencoding('utf-8') | |
file = open('1password.csv','w') | |
parser = etree.XMLParser(encoding='utf-8', recover=True) | |
tree = etree.parse('keepassx.xml', parser) | |
groups = tree.xpath('/database/group') | |
# for group in range(len(groups)): | |
# subgroup = groups[group].xpath('group') | |
# if (len(subgroup)): | |
# # print len(subgroup) | |
# for node in subgroup: | |
# print len(subgroup), groups[group].getchildren()[0].text, node[0].text | |
# else: | |
# print len(subgroup), groups[group].getchildren()[0].text, len(groups[group].xpath('entry')) | |
def getnodes(gr, num): | |
subgroup = gr.xpath('group') | |
entry = gr.xpath('entry') | |
groupTitle = gr[0].text | |
if (len(entry)): | |
for item in entry: | |
title = str(item[0].text) | |
username = str(item[1].text) | |
password = str(item[2].text) | |
url = str(item[3].text) | |
comment = str(item[4].text) | |
# print 'Title:', item[0].text.encode("UTF-8") | |
s = ('"'+title+'","'+url+'","'+username+'","'+password+'","'+comment+'"').replace('None','') | |
file.write(s+'\n') | |
if(len(subgroup)): | |
for node in range(len(subgroup)): | |
# print 'getnodes' | |
getnodes(subgroup[node], node) | |
for group in range(len(groups)): | |
getnodes(groups[group], group) | |
file.close() |
The script does not preserve linebreaks a la
in the comment field. When converting the xml file to csv file all comments are truncated after the first line. I am useless at Python, so you might want to add this your self.
I added support for multiline comments here: https://github.com/gasi/keepass-to-1password
PSA: If you have Double Quotes "
in your passwords 1Password 5 silently fails (for me at least). You have to place another "
to escape the one in your password.
Hi arudmin, thankyou for this script 👍
I first received an error: "ImportError: No module named lxml", this was fixed by (maybe you want to add a hint to step 3) running: pip install --upgrade lxml
Safe yourself some time and use the official supported converter. It doesn't have the issues this one does:
https://support.1password.com/import/
@mathijsbrand, That official conversion method doesn't support Keepass unless it's exported to CSV.
Using script
Finish!