【问题标题】:How can i query csv file and update a value如何查询 csv 文件并更新值
【发布时间】:2021-09-20 22:47:44
【问题描述】:

我正在使用 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)

但还是一无所获。 谁能帮我弄清楚我做错了什么?

【问题讨论】:

  • 您应该创建一个Minimal, Reproducible Example,而不是发布您的整个程序。这应该包括输入 csv 文件的匿名示例。尝试先让一个选项起作用,以便您理解并知道它起作用,然后扩展到您想要的所有选项。
  • 您是否在问为什么您的条件语句不起作用?您是否确定这三个套件都没有执行?或者您是在问为什么当您随后查看文件时这些值没有改变?
  • 如果您在使用 IDE现在是学习其调试功能或内置 Python debugger 的好时机。在程序中的关键点打印 stuff 可以帮助您跟踪正在发生或未发生的事情。 What is a debugger and how can it help me diagnose problems?How to debug small programs
  • @wwii 我已经应用了你的建议,我发现它只执行条件表达式的最后一部分“else”部分,即使满足第一个或第二个条件。
  • 看起来在/之后有缩进问题:if choix == 1: print(""); num1 = str(input("Entez ... - 请修复。

标签: python python-2.7 csv


【解决方案1】:

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

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)

【讨论】:

  • 我已经应用了你的建议,我发现它只执行条件表达式的最后一部分“else”部分,即使第一个或第二个条件得到满足。
  • 当我将条件表达式从“if condition == a”更改为“if condition!= b and conditionc!= c”时,它只执行第一个“if”下的代码并忽略第二个“if”和“else”,即使条件不满足。
猜你喜欢
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2023-03-18
  • 2019-03-09
相关资源
最近更新 更多