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?
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']]
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']]
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?
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}]
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 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.
result = []
for line in text.splitlines():
result.append(Tuple(line.split(",")))
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
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
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)
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.
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
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)