Ecriture dans un fichier txt.

Fermé
preliator - Modifié le 28 déc. 2019 à 12:37
 preliator - 28 déc. 2019 à 21:11
Bonjour à tous,

Grâce à Python, je souhaite pouvoir créer un fichier .txt récapitulant simplement les données d'un fichier CSV contenant des informations de base du type "NOM", "PRENOM", "DATE_NAISSANCE", "VILLE_NAISSANCE", "AGE". Dans un soucis d'efficacité de la base de données, j'ai décidé de supprimer les apostrophes des mots s'ils en possédaient ("L'auberge" devient "Lauberge").

J'ai donc importé les données d'un fichier CSV sur Python, et crée le script me permettant de créer le fichier .txt.

import csv
import re
import sys

#RECUPERATION DES DONNEES DU FICHIER CSV

liste = []
with open("data.csv", "r", newline = '') as donnees:
 reader = csv.reader(donnees, delimiter = ";")
 for line in reader:
  liste.append(list(col.replace("'", '') for col in line)) #SUPPRESSION DES "'"

#ECRITURE SUR FICHIER TEXTE

save=sys.stdout
out = open('result.txt','w')
sys.stdout=out

for row in liste:
  print(row)
sys.stdout=save
out.close()


En ouvrant mon fichier .txt, je retrouve bien les données de mon fichier CSV :
['ZERANO', 'CLAUDE', '29/08/1995', 'LA CIOTAT', '21']
['CANINO', 'KEVIN', '21/02/2001', 'SAINT ETIENNE', '14']
etc.

Dans le cadre de mon exercice, j'aimerais pouvoir enlever les ' des éléments au format numérique (dans mon exemple, cela concernerait les éléments de la colonne "AGE"). Cela donnerait ceci :

['ZERANO', 'CLAUDE', '29/08/1995', 'LA CIOTAT', 21]
['CANINO', 'KEVIN', '21/02/2001', 'SAINT ETIENNE', 14]
etc.

Malheureusement, je ne sais pas trop comment m'y prendre.

Merci.
A voir également:

2 réponses

Bonjour,

Faudrait voir à chercher un peu, convertir un string en integer avec python est une chose qu'on apprend à faire dans n'importe quel tuto de base.
Puis rechercher comment détecter qu'une chaine n'est composée que de chiffres, programmer c'est aussi savoir chercher l'info dont on a besoin, mais tu peux également ouvrir un interpréteur python et taper
help(str)
et tu devrais déjà visualiser une méthode qui te saute aux yeux pour faire cela.

C'est quoi cette façon d'utiliser print pour écrire dans un fichier ? T'as été pêcher ça où ? Dans le genre très mauvais façon de procéder, on est en plein dedans.
Le module io dispose des méthodes write, writeline, writelines pour écrire dans un fichier, c'est complètement absurde de changer temporairement ce que fait sys.stdout pour faire une chose aussi simple.

Et d'ailleurs quel est l'objectif à terme de tes manipulations ?
0
Merci pour ta réponse.
Sache cependant que je m'autoforme à Python, et qu'être "en plein dans la mauvaise manière de procéder" fait malheureusement partie des risques.

L'objectif de mon exercice est de partir d'un fichier de données CSV (NOM, PRENOM, NAISSANCE, VILLE, AGE) à un script .txt pour l'importer sur une base de donnée PostgreSQL. Ceci a aussi pour objectif à m’entraîner sur la gestion des fichiers txt.

Je récupère les données d'un CSV :

ZERANO;CLAUDE;29/08/1995';LA CIOTAT;21
CANINO;KEVIN;21/02/2001;SAINT ETIENNE;14


Et je crée un script dans un fichier txt sous la forme :

insert into NOM_DE_LA_TABLE values
('ZERANO', 'CLAUDE', '29/08/1995', 'LA CIOTAT', 21),
('CANINO', 'KEVIN', '21/02/2001', 'SAINT ETIENNE', 14);

La complexité (pour moi) dans cet exercice réside dans la manipulation de chacun des éléments.
- Supprimer les apostrophes qui peuvent créer des erreurs (Bruna's devient Brunas)
- Séparer chaque élément des colonnes par des ', sauf pour les valeurs numériques
- Placer un ; à la fin des éléments de la liste.
0
trifou > preliator
28 déc. 2019 à 20:03
import csv


values = []
# Format des valeurs, 4 premières de type str, dernière de type int
values_format = '("{}", "{}", "{}", "{}", {})'
with open('data.csv', 'r', newline='') as f:
    reader = csv.reader(f, delimiter=';')
    for line in reader:
        # Echappement des éventuels guillemets sur les 4 premières valeurs 
        line[:-1] = (v.replace('"', '\\"') for v in line[:-1])
        # Conversion en entier de la dernière valeur
        line[-1] = int(line[-1])
        # Ajout aux valeurs de la chaine formatée
        values.append(values_format.format(*line))

# On fournit toujours les noms de colonnes !
sql = 'INSERT INTO NOM_DE_LA_TABLE(NOM_DES_COLONNES) VALUES \n{};'
sql = sql.format(',\n'.join(values))

# Enregiqtrement du sql dans un fichier sql
with open("insert_test.sql", 'w') as f:
    f.write(sql)


Voilà, cela devrait à peu près donner ce que tu souhaites obtenir (aucun intérêt à échapper les apostrophes, a-contrario dles guillemets.
Il n'y a rien de complexe là dedans, cela demande de savoir utiliser les str, listes, les slices, format (au moins le basique), manipuler lecture et écriture des fichiers, comprendre l'unpacking, et tout ça, c'est du basique.
Avant de faire des choses trop complexes, il est indispensable de s'exercer à faire des choses plus simples et de monter au fur et à mesure en compétence en lisant et s’exerçant avec des tutos et exercices python.

Il est à noter que générer soi-même ce genre de fichier sql est à éviter, il est préférable d'utiliser les fonctions de l'api python du sgbdr qui sera beaucoup plus sécurisé pour faire des insertions de valeurs issues d'un csv.
En cherchant rapidement, on trouve :
http://initd.org/psycopg/docs/cursor.html#cursor.copy_from
0
Un grand merci à toi, ce code va vraiment m'aider à progresser.
0