Je lis le fichier CSV et j'ai besoin de faire des tuples mais je dois me débarrasser des citations. Exemples de lignes CSV:

57, 47, 1.04
1288, 317, 1.106
149, 84, 1.05

J'ai essayé

import csv
from pprint import pprint

with open('./Documents/1.csv', encoding='utf-8-sig') as file:
   reader = csv.reader(file, skipinitialspace=True)
   x = list(map(tuple, reader))

Et les résultats sont:

[('57', '47', '1.04'),
 ('1288', '317', '1.106'),
 ('149', '84', '1.05')]

Et j'en ai besoin

[(57, 47, 1.04183),
 (1288, 317, 1.106),
 (149, 84, 1.05)]

J'ai trouvé une question similaire ici mais je ne peux pas encore trouver la réponse.

1
npm 20 nov. 2018 à 08:39

3 réponses

Meilleure réponse

Cela doit ajouter un traitement supplémentaire, la conversion avec la conversion de type:

reader = csv.reader(file, skipinitialspace=True)
# if the file has a header
# header = next(reader)
rows = [[float(row[0]), float(row[1]), float(row[2])] for row in reader]
print rows
1
F.Igor 20 nov. 2018 à 05:44
def num(s):
        try:
            return int(s)
        except ValueError:
            return float(s)


with open('1.csv', encoding='utf-8-sig') as file:
   reader = csv.reader(file, skipinitialspace=True)
   output = [tuple(map(num, x)) for x in map(tuple, reader)]
   print(output)

Production:

[(57, 47, 1.04), (1288, 317, 1.106), (149, 84, 1.05)]
0
backtrack 20 nov. 2018 à 05:53

Vous pouvez utiliser ast.literal_eval() pour convertir les nombres à l'intérieur des tuples à leurs types respectifs:

import csv
from ast import literal_eval
from pprint import pprint

with open('1.csv', encoding='utf-8-sig') as file:
   reader = csv.reader(file, skipinitialspace=True)
   x = [tuple(map(literal_eval, x)) for x in map(tuple, reader)]
   print(x)
   # [(57, 47, 1.04), (1288, 317, 1.106), (149, 84, 1.05)]
1
RoadRunner 20 nov. 2018 à 05:49