web-dev-qa-db-fra.com

Python import csv à la liste

J'ai un fichier CSV avec environ 2000 enregistrements. 

Chaque enregistrement a une chaîne et une catégorie.

This is the first line, Line1
This is the second line, Line2
This is the third line, Line3

J'ai besoin de 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 ceci csv dans la liste dont j'ai besoin avec Python?

138
MorganTN

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')]

Version Python 3.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']]
241
Maciej Gol

Mise à jour pour 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']]
38
seokhoonlee

Pandas est assez bon pour traiter les 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 gros avantage est que les pandas traitent automatiquement les lignes d'en-tête.

Si vous n'avez pas entendu parler de Seaborn , je vous recommande de jeter un coup d'œil.

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]]
31
Martin Thoma

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 le fichier ligne par ligne et split sur ,, puis Poussez le résultat à List

Cela dit, on dirait que vous regardez un fichier CSV, vous pourriez donc envisager d’utiliser les modules pour cela. 

5
Miquel
result = []
for line in text.splitlines():
    result.append(Tuple(line.split(",")))
4
Acid_Snake

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 fichier, il devrait être ouvert avec newline=''.
module csv

4
JawSaw

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
2
Hunter McMillen

Voici le moyen le plus simple de Python 3.x d'importer un fichier CSV dans un tableau multidimensionnel et ses quatre lignes de code sans rien importer!

#pull a CSV into a multidimensional array in 4 lines!

L=[]                            #Create an empty list for the main array
for line in open('log.txt'):    #Open the file and read all the lines
    x=line.rstrip()             #Strip the \n from each line
    L.append(x.split(','))      #Split each line into a list and add it to the
                                #Multidimensional array
print(L)
1
Jason Boucher

En étendant un peu vos exigences et en supposant que vous ne vous souciez pas de l'ordre des lignes et que vous souhaitiez les regrouper par 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 pertinentes disponibles dans le dictionnaire sous la clé étant la catégorie.

1
Jan Vlcinsky

Suivant est un morceau de code qui utilise un module csv mais extrait le contenu de fichier.csv dans une liste de dict 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 __== '__main__':
  your_list = csv2dicts('file.csv')
  print your_list
0
Alexey Antonenko

Comme déjà dit dans les commentaires, vous pouvez utiliser la bibliothèque csv en python. csv signifie des valeurs séparées par des virgules, ce qui semble bien être votre cas: une étiquette et une valeur séparée par une virgule.

Étant une catégorie et un type de valeur, je préférerais utiliser un type de dictionnaire plutôt qu'une liste de n-uplets.

Quoi qu'il en soit, dans le code ci-dessous, je montre les deux manières: d est le dictionnaire et l est la liste des n-uplets.

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)
0
Francesco Boi