Importation de Python csv à la liste
j'ai un fichier CSV avec environ 2000 enregistrements.
chaque enregistrement a une chaîne, et une catégorie à elle.
This is the first line, Line1
This is the second line, Line2
This is the third line, Line3
je dois lire ce fichier dans une liste qui ressemble à ceci;
List = [('This is the first line', 'Line1'),
('This is the second line', 'Line2'),
('This is the third line', 'Line3')]
comment importer ce csv
dans la liste dont J'ai besoin en utilisant Python?
10 réponses
utilisez le module csv
(Python 2.x):
import csv
with open('file.csv', 'rb') as f:
reader = csv.reader(f)
your_list = list(reader)
print your_list
# [['This is the first line', 'Line1'],
# ['This is the second line', 'Line2'],
# ['This is the third line', 'Line3']]
si vous avez besoin de tuples:
import csv
with open('test.csv', 'rb') as f:
reader = csv.reader(f)
your_list = map(tuple, reader)
print your_list
# [('This is the first line', ' Line1'),
# ('This is the second line', ' Line2'),
# ('This is the third line', ' Line3')]
Python 3.version x (par @seokhoonlee ci-dessous)
import csv
with open('file.csv', 'r') as f:
reader = csv.reader(f)
your_list = list(reader)
print(your_list)
# [['This is the first line', 'Line1'],
# ['This is the second line', 'Line2'],
# ['This is the third line', 'Line3']]
mise à jour de Python3 :
import csv
with open('file.csv', 'r') as f:
reader = csv.reader(f)
your_list = list(reader)
print(your_list)
# [['This is the first line', 'Line1'],
# ['This is the second line', 'Line2'],
# ['This is the third line', 'Line3']]
Pandas est assez bon à traiter avec des données. Voici un exemple d'utilisation:
import pandas as pd
# Read the CSV into a pandas data frame (df)
# With a df you can do many things
# most important: visualize data with Seaborn
df = pd.read_csv('filename.csv', delimiter=',')
# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]
# or export it as a list of dicts
dicts = df.to_dict().values()
un grand avantage est que pandas traite automatiquement les lignes d'en-tête.
si vous n'avez pas entendu parler de Seaborn , je vous recommande d'y jeter un oeil.
voir aussi: Comment lire et écrire des fichiers CSV avec Python?
Pandas #2
import pandas as pd
# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()
# Convert
dicts = df.to_dict('records')
le contenu de df est:
country population population_time EUR
0 Germany 82521653.0 2016-12-01 True
1 France 66991000.0 2017-01-01 True
2 Indonesia 255461700.0 2017-01-01 False
3 Ireland 4761865.0 NaT True
4 Spain 46549045.0 2017-06-01 True
5 Vatican NaN NaT True
le contenu des dicts est
[{'country': 'Germany', 'population': 82521653.0, 'population_time': Timestamp('2016-12-01 00:00:00'), 'EUR': True},
{'country': 'France', 'population': 66991000.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': True},
{'country': 'Indonesia', 'population': 255461700.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': False},
{'country': 'Ireland', 'population': 4761865.0, 'population_time': NaT, 'EUR': True},
{'country': 'Spain', 'population': 46549045.0, 'population_time': Timestamp('2017-06-01 00:00:00'), 'EUR': True},
{'country': 'Vatican', 'population': nan, 'population_time': NaT, 'EUR': True}]
Pandas #3
import pandas as pd
# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()
# Convert
tuples = [[row[col] for col in df.columns] for row in df.to_dict('records')]
le contenu de tuples
est:
[['Germany', 82521653.0, Timestamp('2016-12-01 00:00:00'), True],
['France', 66991000.0, Timestamp('2017-01-01 00:00:00'), True],
['Indonesia', 255461700.0, Timestamp('2017-01-01 00:00:00'), False],
['Ireland', 4761865.0, NaT, True],
['Spain', 46549045.0, Timestamp('2017-06-01 00:00:00'), True],
['Vatican', nan, NaT, True]]
si vous êtes sûr qu'il n'y a pas de virgule dans votre entrée, sauf pour séparer la catégorie, vous pouvez lire la ligne de fichier par la ligne et split sur ,
, puis pousser le résultat à List
cela dit, il semble que vous regardez un fichier CSV, donc vous pourriez envisager d'utiliser les modules pour it
result = []
for line in text.splitlines():
result.append(tuple(line.split(",")))
une simple boucle suffirait:
lines = []
with open('test.txt', 'r') as f:
for line in f.readlines():
l,name = line.strip().split(',')
lines.append((l,name))
print lines
mise à jour pour Python3:
import csv
from pprint import pprint
with open('text.csv', newline='') as file:
reader = csv.reader(file)
l = list(map(tuple, reader))
pprint(l)
[('This is the first line', ' Line1'),
('This is the second line', ' Line2'),
('This is the third line', ' Line3')]
si csvfile est un objet file, il doit être ouvert avec newline=''
.
module csv
étendre un peu vos exigences et en supposant que vous ne vous souciez pas de l'ordre des lignes et que vous voulez les regrouper dans des catégories, la solution suivante peut fonctionner pour vous:
>>> fname = "lines.txt"
>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> with open(fname) as f:
... for line in f:
... text, cat = line.rstrip("\n").split(",", 1)
... dct[cat].append(text)
...
>>> dct
defaultdict(<type 'list'>, {' CatA': ['This is the first line', 'This is the another line'], ' CatC': ['This is the third line'], ' CatB': ['This is the second line', 'This is the last line']})
de Cette façon, vous obtenez toutes les lignes disponibles dans le dictionnaire sous clé la catégorie.
suivant est un morceau de code qui utilise le module csv mais extrait le fichier.contenu csv à une liste de dicts en utilisant la première ligne qui est un en-tête de la table csv
import csv
def csv2dicts(filename):
with open(filename, 'rb') as f:
reader = csv.reader(f)
lines = list(reader)
if len(lines) < 2: return None
names = lines[0]
if len(names) < 1: return None
dicts = []
for values in lines[1:]:
if len(values) != len(names): return None
d = {}
for i,_ in enumerate(names):
d[names[i]] = values[i]
dicts.append(d)
return dicts
return None
if __name__ == '__main__':
your_list = csv2dicts('file.csv')
print your_list
comme déjà dit dans les commandes vous pouvez utiliser la bibliothèque csv
en python. csv signifie valeurs séparées par des virgules, ce qui semble exactement votre cas: une étiquette et une valeur séparées par une virgule.
étant un type de catégorie et de valeur, je préférerais utiliser un type de dictionnaire plutôt qu'une liste de tuples.
de toute façon dans le code ci-dessous je montre les deux façons: d
est le dictionnaire et l
est la liste des tuples.
import csv
file_name = "test.txt"
try:
csvfile = open(file_name, 'rt')
except:
print("File not found")
csvReader = csv.reader(csvfile, delimiter=",")
d = dict()
l = list()
for row in csvReader:
d[row[1]] = row[0]
l.append((row[0], row[1]))
print(d)
print(l)