【问题标题】:How can I get my python script to read all values from a config file?如何让我的 python 脚本从配置文件中读取所有值?
【发布时间】:2014-12-24 20:14:00
【问题描述】:

我有几个配置文件。一个带有一些团队名称,另一个带有位置。我的每个用户都会上传一个包含团队和职位的文件。团队和职位必须与配置文件中的内容相匹配,否则将打印错误。我可以让脚本从每个配置文件中只读取一个值。它不会读取其余的值。如何让它读取配置文件中的所有值?

这是两个配置文件: 对于团队: [团队] 球队 = 巴塞罗那、拜仁、国际米兰、切尔西

职位:

[Positions]

positions = striker, midfielder, defender, goalkeeper

这是一个示例文本文件:

Teams   Positions   User ID
Barcelona   goalkeeper  BCTG-F
Barcelona   striker BCTG-F
Bayern  defender    BCTG-F
Bayern  striker    BCTG-F
Inter   striker    BCTG-F
Inter   midfielder  BCTG-F
Chelsea midfielder  BCTG-F
Chelsea goalkeeper  BCTG-F

这是脚本:

#!usr/bin/python


from subprocess import *

import sys
import ConfigParser
import os
import csv
from sys import argv
script, user_id, team_file = argv



def main():

    #get the actions

    def teamCalls():
        actions = ConfigParser.SafeConfigParser()
        actions.read('/etc/nagios/ingestion/team.cfg')
        for section_name in actions.sections():
            for name, value in actions.items(section_name):

                return '%s' %(value)

    teamCalls()

   #get the object types

    def positionTypes():
        objects = ConfigParser.SafeConfigParser()
        objects.read('/etc/nagios/ingestion/position.cfg')
        for section_name in objects.sections():
            for name, value in objects.items(section_name):

                return '%s' % (value)

    positionTypes()

    # checking path to file and user id
    try:
            f = csv.reader(open(team_file, "rb"), delimiter='\t')
    except:  
            logging.error('No such file or directory. Please try again')
    else:
            for line in f: 
                for row in f:                                  
                    if user_id != row[2]:
                        print ("User ID is incorrect")                                                                                 
                    elif teamCalls() != row[0]:

                        print ("Wrong team")                                                                       
                    elif positionTypes() != row[1]:
                        print ("Position not valid")

                    else: 
                        print row

    finally:
        print "all error checks done!"






main()

sys.exit(0) 

【问题讨论】:

    标签: python


    【解决方案1】:

    您在循环的最里面的语句中有“return”。这将导致它立即返回,而无需遍历其余值。如果你想要一个值列表,你可以这样做:

    calls = []
    for section_name in actions.sections():
        for name,value in actions.items(section_name):
           calls.append(str(value))  # same as '%s' % (value)
    return calls
    

    【讨论】:

    • 好的,我试过这样,创建一个调用变量,附加它并返回它,我仍然得到相同的结果
    【解决方案2】:

    怎么样?

    对于打开的行('team.cfg','r'): list_fu = [line.split() 中的列] 打印(list_fu)

    输出:

    ['Teams', 'Positions', 'User', 'ID']
    ['Barcelona', 'goalkeeper', 'BCTG-F']
    ['Barcelona', 'striker', 'BCTG-F']
    ['Bayern', 'defender', 'BCTG-F']
    ['Bayern', 'striker', 'BCTG-F']
    ['Inter', 'striker', 'BCTG-F']
    ['Inter', 'midfielder', 'BCTG-F']
    ['Chelsea', 'midfielder', 'BCTG-F']
    ['Chelsea', 'goalkeeper', 'BCTG-F']
    

    如果你想在这些位置上阅读,你现在应该在列表的列 EG -> Positions,所以它是 1。现在你用 if 条件捕获 Teams 和 User:

    对于 list_fu[1] 中的行: 如果线 == '守门员': print(line) #做你想做的事

    【讨论】:

    • 你把这个放在哪里?在什么功能上?
    • 您在初始化脚本时使用它?之后,您可以使用该列表通过 if 关闭和定义来获得您心爱的回报......也许。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 2017-07-22
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多