Convertir un fichier texte en fichier CSV

Résolu/Fermé
JFL - Modifié le 1 avril 2022 à 15:18
mamiemando Messages postés 33336 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 5 novembre 2024 - 1 avril 2022 à 19:42
Bonjour

J'ai arrêté d'utiliser la suite
kaspersky
et je suis bloqué pour exporter mes mots de passe. Je voudrais utiliser le logiciel libre
keepass
et importer un fichier CSV contenant mes 150 passwords. Hélas, kaspersky manager ne proppose que d'exporter des fichier texte.

Qui pourrait m'aider à écrire un script python transformant le fichier texte suivant en CSV ? Étant débutant, en code python j'ai peur de ne pas y arriver. Ci-dessous, le format du fichier produit par
kaspersky
.

Merci beaucoup.


Websites

Website name: xxxxxxx
Website URL: https://xxxxxxxx.com
Login name: xxxxxxx
Login: ***@***
Password: 123456
Comment:

---

Website name:xxxxxxx
Website URL: http://xxxxxx.com
Login name: xxxxxxx
Login: xxxxxxx
Password: 123456
Comment:

---

Website name: xxxxxxx
Website URL: http://xxxxxx.com
Login name: xxxxxxx
Login: xxxxxxx
Password: 123456
Comment:

---
A voir également:

4 réponses

mamiemando Messages postés 33336 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 5 novembre 2024 7 801
Modifié le 1 avril 2022 à 15:42
Bonjour,

Voilà comment tu peux faire :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import io

# Si tu utilises un fichier, tu peux supprimer cette déclaration
data = io.StringIO("""
Websites

Website name: xxxxxxx
Website URL: [https://xxxxxxxx.com]
Login name: xxxxxxx
Login: ***@***
Password: 123456
Comment:

---

Website name:xxxxxxx
Website URL: [http://xxxxxx.com]
Login name: xxxxxxx
Login: xxxxxxx
Password: 123456
Comment:

---

Website name: xxxxxxx
Website URL: [http://xxxxxx.com]
Login name: xxxxxxx
Login: xxxxxxx
Password: 123456
Comment:

---
""")

def parse_txt(data):
    entries = list()
    entry = dict()
    for line in data.readlines():
        line = line.strip()
        if line == "---":
            entries.append(entry)
            entry = dict()
        if ":" in line:
            tab = line.split(":")
            key = tab[0].strip()
            value = ":".join(tab[1:]).strip()
            entry[key] = value
    if entry:
        entries.append(entry)
    return entries

def entries_to_csv(entries, f):
    columns = sorted(set.union(*[
        set(entry.keys())
        for entry in entries
    ]))
    print("#" + ",".join(columns), file=f)
    print(
        "\n".join(
            ",".join(
                entry.get(key, "")
                for key in columns
            )
            for entry in entries
        ),
        file=f
    )

entries = parse_txt(data)

# Avec un fichier:
# filename_txt = "fichier.txt"
# with open(filename_txt) as f_in:
#    entries = parse_txt(f_in)

filename_csv = "fichier.csv"
with open(filename_csv, "w") as f_out:
    entries_to_csv(entries, f_out)


Contenu de
fichier.csv
:


#Comment,Login,Login name,Password,Website URL,Website name
,***@***,xxxxxxx,123456,https://xxxxxxxx.com,xxxxxxx
,xxxxxxx,xxxxxxx,123456,http://xxxxxx.com,xxxxxxx
,xxxxxxx,xxxxxxx,123456,http://xxxxxx.com,xxxxxxx


Bonne chance
1
yg_be Messages postés 23310 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 5 novembre 2024 Ambassadeur 1 551
1 avril 2022 à 11:52
bonjour,
pour t'aider, il faudrait que tu commences ton programme.
sinon, on le ferait à ta place.
0
Oui je comprends, je vais continuer à progresser sur le travail des fichiers txt avec python et proposer un code .
0
Mamiemando,
C'était costaud comme code à écrire et je suis encore loin de pouvoir générer ce que tu as écrit ! J'ai testé ton code et il marche du feu de Dieu. Grâce à toi je peux mettre Kaspersky password manager à la poubelle. Je ne sais comment te remercier.
Bonne soirée et bon WE.
0
mamiemando Messages postés 33336 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 5 novembre 2024 7 801
1 avril 2022 à 19:42
Je ne sais comment te remercier.

Hé bien comme tu l'as fait, c'est très bien :-) Bonne continuation !
0