J'ai quelques fichiers .csv que je lis et appends chaque colonne à une liste différente.
lst_a = []
lst_b = []
with open(csv_file, 'r') as f_read:
csv_reader = csv.reader(f_read, delimiter = ',')
for row in csv_reader:
lst_a.append(float(row[0]))
lst_b.append(float(row[1]))
print(lst_a) # [0, 2, 4]
print(lst_b) # [1, 3, 5]
3 Réponses :
Ce n'est pas une bonne pratique ou un joli code Python, mais: fonctionne. La raison pour laquelle cela n'est pas recommandé est que vous créez une liste de EDIT: L'utilisation de zip est belle et concise: p> mais n'est pas performant. C'est parce que zip ira déterrer sur les rangées du CSV N fois où n est le nombre de colonnes, alors que la compréhension de la boucle ou de la liste sans zip ne sera pas. Donc, si vous avez un CSV d'un million de lignes et 10 colonnes, cela vous ralentira beaucoup. P> p> Aucun code> avec des effets secondaires et des compréhensions de liste ont été conçues pour avoir des fonctions simples avec la sortie et aucun effet secondaire dans la compréhension. Le code 'APPEND' n'est exécuté que par l'interprète Python tente d'évaluer la liste, même si la liste n'est pas nécessaire. C'est une situation de la boucle pour la création de la boucle! Mais bien sûr, le choix est à vous. P>
THX, j'espérais éviter le append () code>. S'il n'y a pas d'autre moyen, je garderai le pour la boucle code>.
Comme suggéré, la seule façon de voir pour cela utilise zip code>. lst_a, lst_b = * [[[float (i) pour i in x] pour x dans zip (* csv_reader)] code>
Il y a un extra * dans votre code, sans qu'elle fonctionne bien, mais aucune amélioration de la performance lorsque vous comparez au pour la boucle code> peut-être que c'est à cause de zip () code>.
corrigé cela, merci. Oui, c'est la raison pour laquelle je n'ai pas suggéré Zip pour commencer, pour un fichier avec des millions de lignes, Zip doit lire toutes les rangées avant de créer la liste afin de pouvoir être plus lente que ma réponse initiale, qui s'appuie sur une itération sur la Lignes
Il s'agit de millions de fichiers avec ~ 500 lignes, en fait. J'ai accepté la réponse puisque cela fait ce qui a été demandé. Merci pour votre temps.
Il suffit d'utiliser résultat de code> zip code> est un objet zip - un générateur qui donne une itéraitée Sur, donc je devais utiliser zip code>! Il se contentera de tous les 1er éléments, tous les 2nd éléments ... * csv_reader code> - L'étoile est la liste des déballements = Nous passons des éléments de la liste sous forme de paramètres séparés comme paramètres distincts . Cela permet de traiter toutes les sous-listes comme listes d'entrée pour zip code>. P> liste () code> pour imprimer le résultat. p> p>
Vous pouvez le faire avec ZIP et une seule passe à travers le lecteur:
lst_a,lst_b = map(list,zip(*(map(float,row) for row in csvReader)))
Merci. Fonctionne bien, mais il est plus lent en raison de la carte + zip.
Êtes-vous opposé à utiliser une bibliothèque comme Pandas?
Oui, c'est extrêmement lent. Jetez un coup d'œil ici .
Si vous lisez des millions de fichiers, il va juste être lent (surtout en python). Vous voudrez peut-être envisager votre conception, avez-vous besoin de ces deux listes massives, ou pouvez-vous traiter les données comme vous iThérent, etc.
@RaPhaël Il est intéressant de noter que suffisamment en fonction du TimeIt, Pandas le fait mieux que votre code actuel tant que le fichier CSV a suffisamment de lignes. Lorsque votre fichier CSV avait 3 lignes, votre code fonctionne beaucoup mieux, mais une fois que j'ai développé mon CSV à ~ 5k lignes, une simple mise en œuvre de Pandas était environ deux fois plus rapide. (selon le temps imparti
@Chris_rands J'ai besoin d'effectuer un certain calcul dans deux listes avec 500 lignes 5M fois. J'utilisais un seul fichier JSON, mais j'ai commencé à avoir des problèmes de mémoire. Ensuite, j'ai tout sauvegardé dans un fichier HDF5, il était super lent, alors je continuais à utiliser des fichiers individuels individuels de 5 m.
@Karanshishoo J'ai recherché d'autres repères de Pandas et ils sont plus rapides que pour les fichiers plus importants que les vôtres, dans mon cas se trouve beaucoup de petits fichiers (500 rangées max).