如何查询csv文件并更新值



我使用的是python 2.7,基本上我的python脚本包括打开一个csv文件,循环到行中以找到用户输入id的文件。一旦找到行,根据某些条件,脚本将使用用户输入的其他值更新三个行。

这是我的代码:

# -*-coding:Latin-1 -*
import csv
from csv import reader
from csv import DictReader
print("")
print("Sélectionez une operation.")
print("")
print("1. Mettre à jour les indicateurs des tables ENTREPRISE")
print("")
print("2. Mettre à jour les indicateurs des tables PARTICULIER")
print("")
# Nos fichiers csv
# PMGE
Bfr = csv.reader(open('/home/cloudera/PMGE/Bfr.csv'))
linesBfr = list(Bfr)
CredBailImmo = csv.reader(open('/home/cloudera/PMGE/CredBailImmo.csv​'))
linesCredBailImmo = list(CredBailImmo)
def scoreBas(x,y):
return 6*0.5 + x*0.3 + y*0.2
def scoreMoyen(x,y):
return 4*0.5 + x*0.3 + y*0.2
def scoreEleve(x,y):
return 2*0.5 + x*0.3 + y*0.2
while True:
# Récupérer une entrée de l'utilisateur
choix = input("Entrez votre choix (1/2): ")
# Vérifions si le choix fait partie de nos options
if choix in (1, 2): 
if choix == 1:
print("")
print("CHoisissez la table à modifier.")
print("")
print("     1. Besoin en Fonds de Roulement")
print("     2. Credit bail Immobilier")
print("")
while True:
choix = input("Entrez votre choix(1/ 2/: ")
if choix in (1, 2): 
if choix == 1:
print("")
num1 = str(input("Entez le numéro de l'entreprise à modifier: "))
num2 = int(input("Entez la nouvelle valeur de l'indicateur de confiance: "))
num3 = int(input("Entez la nouvelle valeur de l'indicateur de persévérance: "))
i = 0
while linesBfr[i][0] != num1:
i +=1
#indx conf = 32; pers = 33; score = 34;
if linesBfr[i][0] == num1:
#affichage les valeurs actuelle
print("")
print("Ancienne valeur de l'indicateur de confiance:")
print(linesBfr[i][32])
print("Ancienne valeur de l'indicateur de persévérance:")
print(linesBfr[i][33])
print("Ancienne valeur du score:")
print(linesBfr[i][34])
#on modifie les indincateurs dans la liste
linesBfr[i][32] = num2
linesBfr[i][33] = num3
#on écris les modifications dans le fichier csv
writer = csv.writer(open('/home/cloudera/PMGE/Bfr.csv', 'w'))
writer.writerows(linesBfr)
#on modifie le score
if linesBfr[i][31] == 'Bas':
linesBfr[i][34] = scoreBas(int(linesBfr[i][32]),int(linesBfr[i][33]))
writer = csv.writer(open('/home/cloudera/PMGE/Bfr.csv', 'w'))
writer.writerows(linesBfr)
elif linesBfr[i][31] == 'Moyen':
linesBfr[i][34] = scoreMoyen(int(linesBfr[i][32]),int(linesBfr[i][33]))
writer = csv.writer(open('/home/cloudera/PMGE/Bfr.csv', 'w'))
writer.writerows(linesBfr)
else:
linesBfr[i][34] = scoreEleve(int(linesBfr[i][32]),int(linesBfr[i][33]))
writer = csv.writer(open('/home/cloudera/PMGE/Bfr.csv', 'w'))
writer.writerows(linesBfr)
#affichage des nouvelles valeurs
print(linesBfr[i][0])
print(linesBfr[i][31])
print("")
print("Nouvelle valeur de l'indicateur de confiance:")
print(linesBfr[i][32])
print("Nouvelle valeur de l'indicateur de persévérance:")
print(linesBfr[i][33])
print("Nouvelle valeur du score:")
print(linesBfr[i][34])
elif choix == 2:
for row in CredBailImmo :
print(row)
break
else:
print("Invalid Input")
elif choix == 2:
print("Choisissez la table à modifier.")
print("1. ")
print("2. ")
break
else:
print("Invalid Input")

但当我执行脚本时,第三个值linesBfr[i][34]不会更新。我尝试通过(转换为字符串(分别更改条件:

if str(linesBfr[i][31]) == 'Bas':
linesBfr[i][34] = scoreBas(int(linesBfr[i][32]),int(linesBfr[i][33]))
writer = csv.writer(open('/home/cloudera/PMGE/Bfr.csv', 'w'))
writer.writerows(linesBfr)
elif str(linesBfr[i][31]) == 'Moyen':
linesBfr[i][34] = scoreMoyen(int(linesBfr[i][32]),int(linesBfr[i][33]))
writer = csv.writer(open('/home/cloudera/PMGE/Bfr.csv', 'w'))
writer.writerows(linesBfr)
else:
linesBfr[i][34] = scoreEleve(int(linesBfr[i][32]),int(linesBfr[i][33]))
writer = csv.writer(open('/home/cloudera/PMGE/Bfr.csv', 'w'))
writer.writerows(linesBfr)

但仍然一无所获有人能帮我弄清楚我做错了什么吗?

这不是一个答案-如果简化有问题的条件表达式,可能会更容易进行故障排除。

name = str(linesBfr[i][31])
if name == 'Bas':
placeholder = scoreBas
elif name == 'Moyen':
placeholder = scoreMoyen
else:
placeholder = scoreEleve
linesBfr[i][34] = placeholder(int(linesBfr[i][32]),int(linesBfr[i][33]))
with open('/home/cloudera/PMGE/Bfr.csv', 'w') as f:
writer = csv.writer(f)
writer.writerows(linesBfr)

最新更新