J'ai vu une personne qui a du mal à écrire une double boucle par elle-même pour lire csv comme ce qui suit en Python, je vais donc résumer quatre méthodes de lecture typiques.
sample.csv
1,2,3
4,5,6
7,8,9
10,11,12
De plus, StringIO est utilisé ici pour émuler la lecture de fichiers, mais lorsque vous l'utilisez réellement, veuillez le lire comme une fonction ouverte ou une chaîne de caractères du nom de fichier, selon le cas.
Comment utiliser CSV qui est une bibliothèque standard de Python. Cela peut avoir l'avantage de travailler uniquement avec la bibliothèque standard, mais en réalité, il est peu probable que vous manipuliez des données qui ne contiennent que des valeurs numériques sous forme de liste double.
Notez que chaque élément est toujours une chaîne, donc nous mettons map (int, row)
entre les deux pour le convertir en nombre.
from io import StringIO
import csv
s = """1,2,3
4,5,6
7,8,9
10,11,12"""
with StringIO(s) as csvfile:
csvreader = csv.reader(csvfile)
rows = []
for row in csvreader:
rows.append(list(map(int, row)))
#ou liste de notation d'inclusion
with StringIO(s) as csvfile:
csvreader = csv.reader(csvfile)
rows = [list(map(int, row)) for row in csvreader]
import numpy as np
arr = np.array(rows)
numpy
loadtxt et [genfromtxt](https://numpy.org/doc/stable/reference/generated /numpy.genfromtxt.html?highlight=genfromtxt#numpy.genfromtxt). Les deux ont des interfaces similaires, mais genfromtxt est un peu plus sophistiqué car il peut remplacer les valeurs manquantes.
numpy.loadtxt
from io import StringIO
import numpy as np
s = """1,2,3
4,5,6
7,8,9
10,11,12"""
with StringIO(s) as csvfile:
arr = np.loadtxt(csvfile, delimiter=",", dtype=int)
numpy.genfromtxt
from io import StringIO
import numpy as np
s = """1,2,3
4,5,6
7,8,9
10,11,12"""
with StringIO(s) as csvfile:
arr = np.genfromtxt(csvfile, delimiter=",", dtype=int)
pandas
np.genfromtxt peut également gérer les valeurs manquantes, mais les pandas peuvent être plus faciles à trouver des informations.
pandas.read_csv
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Cette fois, il est traité comme un csv sans en-tête, alors mettez l'option header = None
.
from io import StringIO
import pandas as pd
s = """1,2,3
4,5,6
7,8,9
10,11,12"""
with StringIO(s) as csvfile:
df = pd.read_csv(csvfile, header=None, dtype=int)
arr = df.values
Veuillez me faire savoir s'il existe une autre méthode pratique.
Recommended Posts