2017-09-11 3 views
0

J'ai une feuille Excel avec ce format:Comment vérifier le numéro existe ou non en python pour la boucle

from amount to 

314 $470.21 275 

12 $1,788.98 149 

316 $2,949.53 417 

5 $2,193.48 454 

198 $1,402.76 371 

82 $1,212.14 420 

222 $1,167.72 396 

et de rendre toutes les données csv avec boucle:

import csv 

def csv_data(path): 
    with open(path) as csv_file: 
     readCSV = csv.DictReader(csv_file) 

     for line in readCSV: 
      col_from = line['from'] 
      col_to = line['to'] 
      col_ammount = line['amount'] 
      print(col_from, col_amount, col_to) 

csv_data('transactions.csv') 

Par exemple, dans " de la colonne "j'ai trouvé la valeur 314 maintenant comment puis-je vérifier dans toutes les valeurs de" à la colonne "que cette valeur existe ou non. En fait, je veux calculer le solde actuel de tous les numéros de compte à partir de.

Comment ajouter si condition correctement dans la boucle?

+0

pouvez-vous donner un exemple Comment la balance actuelle sera calculée. – katrik

+0

Avez-vous essayé le forfait pandas? –

+0

pourquoi n'utilisez-vous pas quelque chose comme sum ([x ['from'] pour x dans readCSV]) après que tout le fichier est lu? –

Répondre

0

Je vous donne cherchez quelque chose comme ça ..

for line in readCSV: 
    if line['form']: 
     #do something if "from" exist 
    else: 
     #do something if "from" do not exit 
    if line['to']: 
     # do something if "to" exist 
    else: 
     # do something if "to" do not exit 
    if line['amount']: 
     #do something if "amount" exist 
    else: 
     #do something if "amount" do not exist 
0

Je pense que votre problème principal est que vous écrasez la col_from, col_to et col_amount liste encore et encore. Imprimer la valeur à partir de la boucle peut vous rendre confus en pensant que toutes vos valeurs seraient stockées dans ces listes. Essayez et appelez print(col_from, col_amount, col_to) en dehors de la boucle for et vous obtiendrez seulement le dernier élément. Une meilleure façon serait de créer des listes vides et append les éléments.

Deuxièmement, je pense que vous devriez vous occuper du format de données qui est int et float, mais le csv.DictReader retournera des chaînes pour tous les éléments de votre matrice. Puis, en vérifiant si les valeurs de col_from apparaissent également dans col_to est facilement fait avec la compréhension de la liste. Vous pouvez créer une liste qui contient "True" pour toutes les lignes dans lesquelles votre condition s'applique et "False" si elles ne le sont pas (ce qui est le cas pour toutes vos données d'exemple).

Une suggestion qui est proche de votre solution serait:

import csv 

def csv_data(path): 
    with open(path) as csv_file: 
     readCSV = csv.DictReader(csv_file, delimiter=";", quoting=csv.QUOTE_NONE) # supposed that your delimiter is ";", otherwise use , or \tab 

     col_from, col_to, col_amount = [], [], [] # initialize empty lists 

     for line in readCSV: # append entries to your lists 
      col_from.append(int(line['from'])) 
      col_to.append(int(line['to'])) 
      col_amount.append(float(line['amount'])) 

     bool_list = [True if col_from[i] in col_to else False for i in range(len(col_from))] # A list with Trues and Falses 
     return bool_list 

print csv_data('transactions.csv') 
# out: [False, False, False, False, False, False, False] 
0

En supposant que vous êtes capable de stocker avec succès les valeurs du « à » et « de » colonnes dans une liste, vous pouvez effectuer une opération d'intersection sur les 2 listes pour obtenir toutes les valeurs communes qui existent dans les deux la liste.

col_from = [314, 12, 316, 5, 198, 82, 222] 
col_to = [275, 149, 417, 454, 371, 420, 396] 
intersection = list(set(col_from) & set(col_to)) 

Maintenant intersection doit contenir toutes les valeurs communes à la fois la liste, qui dans ce cas sera une liste vide. Vous pouvez également rechercher des valeurs spécifiques en le modifiant un peu

list(set([314]) & set(col_to))