To take care of the notes also.
Use llms to correct the identations. (Soory but it breaks when I post it)
Then use : python3 convert.py -i norton_export.csv -o proton_import.csv -v "Personal"
# 2. TRAITEMENT DES NOTES SÉCURISÉES (notes)
elif format_type in ["notes", "note"]:
# Dans l'export Norton :
# row[0] = "notes"
# row[1] = Titre de la note
# row[2] = Contenu / Texte de la note
note_title = row[1] if len(row) > 1 and row[1] else "Note sans titre"
note_content = row[2] if len(row) > 2 else ""
# Écriture du fichier pour Proton Pass
with open(output_file, mode="w", encoding="utf-8", newline="") as outfile:
writer = csv.writer(outfile)
writer.writerows(transformed_rows)
To take care of the notes also.
Use llms to correct the identations. (Soory but it breaks when I post it)
Then use : python3 convert.py -i norton_export.csv -o proton_import.csv -v "Personal"
import argparse
import csv
def transform_norton_to_proton(input_file, output_file, vault_name):
transformed_rows = []
# En-tête standard Proton Pass
header = [
"type",
"name",
"url",
"email",
"username",
"password",
"note",
"totp",
"vault",
]
transformed_rows.append(header)
logins_count = 0
notes_count = 0
try:
with open(input_file, mode="r", encoding="utf-8") as infile:
reader = csv.reader(infile)
for row in reader:
if not row or len(row) == 0:
continue
format_type = row[0].strip().lower()
# 1. TRAITEMENT DES IDENTIFIANTS (login)
if format_type == "login":
email_or_user = row[1] if len(row) > 1 else ""
password = row[2] if len(row) > 2 else ""
service_name = row[3] if len(row) > 3 else ""
url = row[4] if len(row) > 4 else ""
note = row[5] if len(row) > 5 else ""
transformed_rows.append(
[
"login", # type
service_name, # name
url, # url
email_or_user, # email
"", # username
password, # password
note, # note
"", # totp
vault_name, # vault
]
)
logins_count += 1
# 2. TRAITEMENT DES NOTES SÉCURISÉES (notes)
elif format_type in ["notes", "note"]:
# Dans l'export Norton :
# row[0] = "notes"
# row[1] = Titre de la note
# row[2] = Contenu / Texte de la note
note_title = row[1] if len(row) > 1 and row[1] else "Note sans titre"
note_content = row[2] if len(row) > 2 else ""
transformed_rows.append(
[
"note", # type
note_title, # name
"", # url
"", # email
"", # username
"", # password
note_content, # note
"", # totp
vault_name, # vault
]
)
notes_count += 1
# Écriture du fichier pour Proton Pass
with open(output_file, mode="w", encoding="utf-8", newline="") as outfile:
writer = csv.writer(outfile)
writer.writerows(transformed_rows)
print(f" Conversion terminée avec succès !")
print(f" - Identifiants traités : {logins_count}")
print(f" - Notes traitées : {notes_count}")
print(f" Fichier généré : {output_file}")
except FileNotFoundError:
print(f"Erreur : Fichier '{input_file}' introuvable.")
except Exception as e:
print(f"Erreur lors de la conversion : {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Convertit un export Norton CSV vers le format Proton Pass."
)
parser.add_argument(
"-i",
"--input",
default="input.csv",
help="Fichier CSV source Norton (par défaut : input.csv)",
)
parser.add_argument(
"-o",
"--output",
default="proton_import.csv",
help="Fichier CSV de sortie (par défaut : proton_import.csv)",
)
parser.add_argument(
"-v",
"--vault",
default="Personal",
help="Nom du coffre-fort Proton Pass (ex: Personal ou Principal)",
)
args = parser.parse_args()
transform_norton_to_proton(args.input, args.output, args.vault)