精华内容
下载资源
问答
  • Python做用户管理系统

    千次阅读 2019-04-12 21:51:42
    本程序未引入文件,所以数据不会保存,关闭程序后数据会消失 代码如下 surface = """ #三引号是Python的注释...用户管理系统 **************************************** 1、注册新用户 2、用户登录 3、用户...

    本程序未引入文件,所以数据不会保存,关闭程序后数据会消失
    代码如下

    surface = """  #三引号是Python的注释符号,但也可以作为字符串输出
    ****************************************
    
    用户管理系统
    
    ****************************************
    
    
    
       1、注册新用户
       2、用户登录
       3、用户注销
       4、用户信息显示
       5、退出系统
    
       
    """
    userinfo={      #用来保存数据的字典
        'root':{
            'name': 'root',
            'password': 'redhat',
            'gender': 1,
            'email': '',
            'age': '12'
    
            },
    
        }
    gender_choice=[0,1,2]
    
    def CreateUser():          #创建用户
        print("注册用户界面".center(50,"*"))
        name=input("*注册用户名:")
        if name in userinfo:
            print("用户已存在,请更换注册名")
        else:
            password=input("*用户密码:")
            while True:
                gender1=input('*性别(0-男,1-女,2-其他)')
                gender=int(gender1)
                if gender in gender_choice:
                    break
                else:
                    print("请输入正确的选择")
            email=input("用户邮箱:")
            if not email:
                email=None
            age=input('年龄:')
            if not age:
                age=None
            else:
                age=int(age)
            userinfo[name]={
                'name':name,
                'password':password,
                'gender':gender,
                'email':email,
                'age':age,
                }
            print("%s  用户注册成功!!!" % (name))
    
    def UserLogin():         #用户登录
        print("用户登录界面".center(50,'*'))
        trycount = 0
        while trycount < 3:     #用户输入错误三次则结束循环
            name=input("登录用户名:")
            if name not in userinfo:
                print("用户未注册")
                break
            password=input("登录密码:")
            trycount +=1
            if password == userinfo[name]['password']:
                print("恭喜%s登录成功" % (name))
                break
            else:
                print("请输入正确的用户名或密码!")
        else:
            print("已登录三次,请稍后再试")
    
    def DeleteUser():     #删除用户
        print("用户注销界面".center(50,'*'))  #表示50的长度,字符串放中间,空白的地方自动填充*号
        name = input("注销用户名:")
        if name not in userinfo:
            print("用户未注册")
        else:
            password=input("登录密码:")
            if password==userinfo[name]['password']:
                userinfo.pop(name)
                print('恭喜注销%s成功' % (name))
    
    def UserInfo():
        for key,value in userinfo.items():    #迭代字典
            print("用户:%s" % (key)),
            print("性别:%d" % (value['gender'])),
            print("邮箱:%s" % (value['email'])),
            print("年龄:%s" % (value['age'])),
            print("\n\n")
    
    def main():   #主函数
        while True:
            print (surface)
            choice = input("Choice:").strip()   #删除前后空白字符串
            if choice == '1':
                CreateUser()
            elif choice == '2':
                UserLogin()
            elif choice == '3':
                DeleteUser()
            elif choice == '4':
                UserInfo()
            elif choice == '5':
                exit()            #关闭程序
            else:
                print("请输入正确的选择")
    
    main()
    
    展开全文
  • 准系统python文件管理系统 规格 生成一个应用程序以通过IP同步源文件夹和目标文件夹: 1.1一个简单的命令行客户端,该客户端将一个目录作为参数,并监视该目录中的更改并将所有更改上传到其服务器 1.2一个简单的...
  • 1.本人第一次学python做出来的,当时满满的成就感,当作纪念!!!!! 非常简单,复制即可使用 代码块 import json#把字符串类型的数据转换成Python基本数据类型或者将Python基本数据类型转换成字符串类型。 def ...
  •  欢迎进入学生管理系统 | 1.添加学员 | 2.删除学员 | 3.修改学员信息 | 4.查询学员信息 | 5.显示全部学员信息 | 6.按年龄从小到大显示全部学员信息 | 7....
  • 学了一段时间的python后,自己动手了一个函数版-简单的学生信息管理系统。 功能如下 新增学生信息; 修改学生信息; 删除学生信息; 查询学生信息; 显示学生信息; 将数据录入文件; 读取文件数据; 退出系统。 ...

    学习文件模块后,将之前做的学生信息管理系统添加文件模块。

    功能如下

    1. 新增学生信息;
    2. 修改学生信息;
    3. 删除学生信息;
    4. 查询学生信息;
    5. 显示学生信息;
    6. 将数据录入文件;
    7. 读取文件数据;
    8. 退出系统。
      在这里插入图片描述

    主函数部分

    这里定义一个列表L,用来存储学生信息。
    在这里插入图片描述

    增加学生信息

    将学生信息保存为字典添加到列表里。

    def add():
        dict1 = {}
        sName = input("请输入学生姓名:")
        sAge = eval(input("请输入学生年龄:"))
        sNumber = eval(input("请输入学生学号:"))
        tele_num = eval(input("请输入手机号码:"))
        dict1["name"] = sName
        dict1["age"] = sAge
        dict1["sNumber"] = sNumber
        dict1["tele_num"] = tele_num
        L.append(dict1)
        print("增加成功")
        input("按任意键返回菜单")
    

    在这里插入图片描述

    修改学生信息

    这里以学号为索引值,如果学号不在学生库里则提示无此学生。

    def modify():
        num = eval(input("请输入学生学号:"))
        index1 = -1
        for i,dict in enumerate(L):
            if dict.get("sNumber") == num:
                index1 = i
                break
        if index1 != -1:
            L[index1]['name'] = input("请输入新的姓名:")
            L[index1]['age'] = eval(input("请输入新的年龄:"))
            L[index1]['sNumber'] = eval(input("请输入新的学号:"))
            L[index1]['tele_num'] = eval(input("请输入新的手机号:"))
            print("修改成功")
        else:
            print("无此学生")
        input("按任意键返回菜单")
    

    删除学生信息

    删除学生也是以学号为索引值,如果学号不在学生库里则提示无此学生。

    def delete():
        num = eval(input("请输入要删除学生的学号:"))
        index1 = -1
        for i, dict in enumerate(L):
            if dict.get("sNumber") == num:
                index1 = i
                break
        if index1 != -1:
            del L[index1]
            print("删除成功")
        else:
            print("无此学生")
        input("按任意键返回菜单")
    

    查询学生

    查询成功此显示学生信息,否则提示无此学生。

    def search():
        num = eval(input("请输入要查询学生的学号:"))
        index1 = -1
        for i, dict in enumerate(L):
            if dict.get("sNumber") == num:
                index1 = i
                break
        if index1 != -1:
            print("姓名:%s 年龄:%d 学号:%d 手机号码:%d" % (L[index1]["name"], L[index1]["age"], \
                                           L[index1]["sNumber"], L[index1]["tele_num"]))
        else:
            print("无此学生")
        input("按任意键返回菜单")
    

    显示所有学生的信息

    def prin():
        if len(L) == 0:
            print("无成员")
        else:
            for dict1 in L:
                print("姓名:%s 年龄:%d 学号:%d 手机号码:%d"%(dict1["name"], dict1["age"],\
                                           dict1["sNumber"], dict1["tele_num"]))
        input("按任意键返回菜单")
    

    将数据录入文件

    因为每个学生的信息是字典类型,所以录入之前先转化为字符串。

    def write_file():
        file = open("student_list.data", 'w', encoding='utf-8')
        for i in L:
            file.write(str(i) + '\n')
        file.close()
        input("录入成功,按任意键返回菜单!")
    

    读取文件数据

    读取到的信息是字符串,可以使用eval()函数将信息变为原来的字典类型,再添加到列表里。

    def read_file():
        try:
            file = open("student_list.data", 'r', encoding='utf-8')
            content = file.readlines()
            for i in content:
                L.append(eval(i))
            file.close()
            input("读取完成,按任意键返回菜单!")
        except:
            print("文件不存在")
    
    展开全文
  • 一、 为什么要使用配置如果我们在较复杂的项目中不使用配置文件,我们可能会面临下面的情况:你决定更改你的项目中数据库的 host, 因为你要将项目从测试环境转移到实际的上产环境中。如果你的项目中多个位置用到了...

    一、 为什么要使用配置

    如果我们在较复杂的项目中不使用配置文件,我们可能会面临下面的情况:

    你决定更改你的项目中数据库的 host, 因为你要将项目从测试环境转移到实际的上产环境中。如果你的项目中多个位置用到了这个 host,那你不得不一个一个找到这些位置再修改成新的 host。花了半天,然后过了一天,你发现项目在生产环境有些问题,需要重新移回测试环境,你得再次修改,这样工作很繁琐很不优雅。

    你开发了一个很棒的开源项目,你想将其放到版本控制系统例如github上,但是你服务器的主机的地址、账号、密码也都上传上去了,但是你没有意识到,直到有个 bad guy 拿到了你的信息,从你的服务器窃取信息、攻击你的服务器,让你产生了极大的损失。然后你想把程序改动一下,把涉密的信息比如地址密码都删掉,可是由于版本控制的原因,别人依然能看到你以前版本的代码。于是你不得不改掉你的账户、密码等,真的是个悲伤的开源项目经历。

    但是,如果你使用了配置管理呢,那会有以下几个优点:

    这样就提高了代码的重用性,不再每次都去修改代码内部

    这意味着其他不太懂你代码内部的人也可以使用你的项目,只用根据需求更改配置即可

    有利于团队协作

    有利于安全数据/秘密数据的管理

    二、Python 中进行配置管理的几种方式

    由于使用 Python 较多,因此基于 Python 进行配置管理的相关说明,当然其他语言也都是大同小异,主要思想还是不变。

    2.1 使用 Python 内置的数据结构(如字典)

    2.1.1单个文件下的单个配置

    我们很自然就能想到这一点,例如以下代码:

    # main.py

    import pymysql

    DATABASE_CONFIG = {

    "host":"localhost",

    "dbname":"db",

    "user":"user",

    "password":"pwd",

    "port":3306

    }

    def connect_db_do_something1(dbname):

    if dbname != config.DATABASE_CONFIG["dbname"]:

    raise ValueError("Couldn"t not find DB with given name")

    conn = pymysql.connect(host=config.DATABASE_CONFIG["host"],

    user=config.DATABASE_CONFIG["user"],

    password=config.DATABASE_CONFIG["password"],

    db=config.DATABASE_CONFIG["dbname"])

    """

    do something 1

    """

    def connect_db_do_something2(dbname):

    if dbname != config.DATABASE_CONFIG["dbname"]:

    raise ValueError("Couldn"t not find DB with given name")

    conn = pymysql.connect(host=config.DATABASE_CONFIG["host"],

    user=config.DATABASE_CONFIG["user"],

    password=config.DATABASE_CONFIG["password"],

    db=config.DATABASE_CONFIG["dbname"])

    """

    do something 2

    """

    connect_db_do_something1("db")

    connect_db_do_something2("db")

    在上面的代码中,我们可以看到,同一数据库配置,我们反复使用了两次,如果我们需要更改数据库相关的数据如password,我们不需要在两个方法内部修改,而是只用修改DATABASE_CONFIG字典中的相关值即可。和以前没有配置管理的时候相比,减少了太多的工作量了。

    2.1.2多个文件下的单个配置

    但是当你的项目开始变得复杂的时候,你的文件就不止一个这么简单了,这时候如果我需要在 main2.py 里面需要用 DATABASE_CONFIG 的时候就不是很方便了,因为如果直接 import main 的时候,虽然能够使用 main.DATABASE_CONFIG ,但同时 mian.py 中的

    connect_db_do_something1("db")

    connect_db_do_something2("db")

    也被执行了,这可不是我们想看到的,因此我们有了新的需求,能在同一个项目下的不同文件里简单快速的导入我们的数据库配置 DATABASE_CONFIG,于是我们想出了下面的方法来解决这个问题:

    # config.py

    DATABASE_CONFIG = {

    "host": "localhost",

    "dbname": "db",

    "user": "user",

    "password": "pwd",

    "port": 3306

    }

    # main1.py

    import pymysql

    import config

    def connect_db_do_something1(dbname):

    if dbname != config.DATABASE_CONFIG["dbname"]:

    raise ValueError("Couldn"t not find DB with given name")

    conn = pymysql.connect(host=config.DATABASE_CONFIG["host"],

    user=config.DATABASE_CONFIG["user"],

    password=config.DATABASE_CONFIG["password"],

    db=config.DATABASE_CONFIG["dbname"])

    """

    do something 1

    """

    connect_db_do_something1("db")

    # main2.py

    import pymysql

    import config

    def connect_db_do_something2(dbname):

    if dbname != config.DATABASE_CONFIG["dbname"]:

    raise ValueError("Couldn"t not find DB with given name")

    conn = pymysql.connect(host=config.DATABASE_CONFIG["host"],

    user=config.DATABASE_CONFIG["user"],

    password=config.DATABASE_CONFIG["password"],

    db=config.DATABASE_CONFIG["dbname"])

    """

    do something 2

    """

    connect_db_do_something2("db")

    按照上面的代码,我们可以在两个不同的文件 main1.py 和 main2.py 中分别引用 config.py 中配置了,我们的配置管理看起来更进一步了。

    2.1.3 单个文件下的多个配置

    有可能我们的项目需要多个配置文件,比如测试环境和生产环境。先从单个文件讲起,我们可以采用如下解决方案:

    # config.py

    class Config:

    APP_NAME = "myapp"

    SECRET_KEY = "secret-key-of-myapp"

    ADMIN_NAME = "administrator"

    AWS_DEFAULT_REGION = "ap-northeast-2"

    STATIC_PREFIX_PATH = "static"

    ALLOWED_IMAGE_FORMATS = ["jpg", "jpeg", "png", "gif"]

    MAX_IMAGE_SIZE = 5242880 # 5MB

    class DevelopmentConfig(Config):

    DEBUG = True

    AWS_ACCESS_KEY_ID = "aws-access-key-for-dev"

    AWS_SECERT_ACCESS_KEY = "aws-secret-access-key-for-dev"

    AWS_S3_BUCKET_NAME = "aws-s3-bucket-name-for-dev"

    DATABASE_URI = "database-uri-for-dev"

    class TestConfig(Config):

    DEBUG = True

    TESTING = True

    AWS_ACCESS_KEY_ID = "aws-access-key-for-test"

    AWS_SECERT_ACCESS_KEY = "aws-secret-access-key-for-test"

    AWS_S3_BUCKET_NAME = "aws-s3-bucket-name-for-test"

    DATABASE_URI = "database-uri-for-dev"

    class ProductionConfig(Config):

    DEBUG = False

    AWS_ACCESS_KEY_ID = "aws-access-key-for-prod"

    AWS_SECERT_ACCESS_KEY = "aws-secret-access-key-for-prod"

    AWS_S3_BUCKET_NAME = "aws-s3-bucket-name-for-prod"

    DATABASE_URI = "database-uri-for-dev"

    # main.py

    import sys

    import config

    import sys

    import config

    """

    do some important things

    """

    if __name__ == "__main__":

    env = sys.argv[1] if len(sys.argv) > 2 else "dev"

    if env == "dev":

    app.config = config.DevelopmentConfig

    elif env == "test":

    app.config = config.TestConfig

    elif env == "prod":

    app.config = config.ProductionConfig

    else:

    raise ValueError("Invalid environment name")

    这样我们就可以从一个配置文件中获取不同级别的不同配置了。

    2.1.4 多个文件下的多个配置

    和上面类似,只不过换成了从不同的文件中读取同一个配置文件的不同配置:

    # config.py

    class Config:

    APP_NAME = "myapp"

    SECRET_KEY = "secret-key-of-myapp"

    ADMIN_NAME = "administrator"

    AWS_DEFAULT_REGION = "ap-northeast-2"

    STATIC_PREFIX_PATH = "static"

    ALLOWED_IMAGE_FORMATS = ["jpg", "jpeg", "png", "gif"]

    MAX_IMAGE_SIZE = 5242880 # 5MB

    class DevelopmentConfig(Config):

    DEBUG = True

    AWS_ACCESS_KEY_ID = "aws-access-key-for-dev"

    AWS_SECERT_ACCESS_KEY = "aws-secret-access-key-for-dev"

    AWS_S3_BUCKET_NAME = "aws-s3-bucket-name-for-dev"

    DATABASE_URI = "database-uri-for-dev"

    class TestConfig(Config):

    DEBUG = True

    TESTING = True

    AWS_ACCESS_KEY_ID = "aws-access-key-for-test"

    AWS_SECERT_ACCESS_KEY = "aws-secret-access-key-for-test"

    AWS_S3_BUCKET_NAME = "aws-s3-bucket-name-for-test"

    DATABASE_URI = "database-uri-for-dev"

    class ProductionConfig(Config):

    DEBUG = False

    AWS_ACCESS_KEY_ID = "aws-access-key-for-prod"

    AWS_SECERT_ACCESS_KEY = "aws-secret-access-key-for-prod"

    AWS_S3_BUCKET_NAME = "aws-s3-bucket-name-for-prod"

    DATABASE_URI = "database-uri-for-dev"

    class CIConfig:

    SERVICE = "travis-ci"

    HOOK_URL = "web-hooking-url-from-ci-service"

    # main1.py

    import config

    dev_config = config.DevelopmentConfig

    """

    do something

    """

    # main2.py

    import config

    app.ci = config.CIConfig

    """

    do otherthing

    """

    这样使用更加灵活了,从不同的文件里读取不同的配置,而我们对于配置的增删改只需要在 config.py 中进行,配置管理技能再次进阶!

    2.2 使用外部配置文件

    比起使用 Python 内建的数据结构,更加通用的方法是使用外部配置文件,因为这些文件只会被视为配置文件,而不会像 config.py 一样有代码的属性。外部配置文件的格式多种多样,我们在使用它的时候会根据文件格式有不同的读取方式。例如:*.yaml 或者 *.yml、*.json、*.cfg 或 *.conf 、*.ini , 甚至是你自定义的文件 *.yourname 。

    2.2.1 YAML

    YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans在2001年首次发表了这种语言[1],另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者[2]。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。

    ----- 中文维基百科

    YAML 看起来像下面这种格式:

    mysql:

    host: localhost

    dbname: db

    user: user

    passwd: pwb

    port: 3306

    other:

    host: other_host

    dbname: other_db

    user: other_user

    passwd: other_pwb

    port: 3306

    可以通过类似下面的代码来读取里面的内容:

    import yaml

    with open("config.yml", "r") as ymlfile:

    cfg = yaml.load(ymlfile)

    print(cfg["mysql"])

    将输出以下内容

    {"host": "localhost",

    "dbname": "db",

    "user": "user",

    "password": "pwd",

    "port": 3306}

    如果需要从 python 写入配置到 YAML 也很容易,只需要使用 yaml.dump(dict) 即可,dict 指的是配置的字典。更加详细的内容可以查看 PyYAML Documentation

    2.2.2 INI

    INI文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统,或是其他操作系统上,许多程序也会采用INI文件做为设置程序之用。Windows操作系统后来以注册表的形式取代掉INI档。INI文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。有时候,INI文件也会以不同的扩展名,如“.CFG”、“.CONF”、或是“.TXT”代替。

    ----- 中文维基百科

    它长的像这样:

    [mysql]

    host=localhost

    dbname=db

    user=user

    passwd=pwd

    port=3306

    [other]

    host=other_host

    dbname=other_db

    user=other_user

    passwd=other_pwb

    port=3306

    通过以下代码可以读取它:

    import configparser

    config = configparser.ConfigParser()

    config.read("config.ini")

    host = config["mysql"]["host"]

    print(host)

    这将输出 INI 配置文件中的 mysql section 中的 host 值

    要写入 INI 配置文件也很简单,参考如下代码即可:

    import configparser

    config = configparser.ConfigParser()

    config.read("config.ini")

    config["mysql"]["test_str"] = "a test string"

    config.write(open("ini", "w"))

    现在的配置文件会变成:

    [mysql]

    host = localhost

    dbname = db

    user = user

    passwd = pwd

    port = 3306

    test_str = a test string

    [other]

    host=other_host

    dbname=other_db

    user=other_user

    passwd=other_pwb

    port=3306

    2.2.3 JSON

    JSON是JavaScript对象表示法的缩写。它非常广泛,因此对许多编程语言都有很好的支持。它的格式大家也很眼熟,看起来和 Python 中的字典很像:

    {

    "mysql":{

    "host": "localhost",

    "dbname": "db",

    "user" : "user",

    "password": "pwd",

    "port": 3306

    },

    "other":{

    "host": "other_host",

    "dbname": "other_db",

    "user": "other_user",

    "passwd": "other_pwb",

    "port": 3306

    }

    你可以参考以下代码读取:

    import json

    with open("config.json") as json_data_file:

    config = json.load(json_data_file)

    host = config["mysql"]["host"]

    print(host)

    # output: localhost

    要将配置写入json中也很简单,参考以下代码:

    import json

    with open("config.json") as json_data_file:

    config = json.load(json_data_file)

    config["mysql"]["test_str"] = "a test string"

    with open("config.json", "w") as outfile:

    json.dump(config, outfile)

    这样就会得到增加了配置的json文件了:

    {

    "mysql":{

    "host": "localhost",

    "dbname": "db",

    "user" : "user",

    "password": "pwd",

    "port": 3306,

    "test_str" : "a test string"

    },

    "other":{

    "host": "other_host",

    "dbname": "other_db",

    "user": "other_user",

    "passwd": "other_pwb",

    "port": 3306

    }

    }

    其他格式的文件大多如此,就不赘述了。并且外部的配置文件中也可以配置多个配置(mysql, other等)

    2.3 使用环境变量

    但是,回到我们开篇讲的问题,以上的两种配置管理方案(使用 Python 内置的数据结构、使用外部配置文件) 都忽略了两个问题:

    其一,我们如何应对安全数据直接曝光于公众的可能问题呢,如果我们需要使用版本控制系统例如 Github,或许我们可以尝试将 config.py 文件放到 .gitignore 里面,但我们如果哪一天修改了仓库,忘了将 config.py 忽略掉而 push 到了GitHub 上,那么我们的安全敏感信息仍然会向公众泄露,由于版本控制的存在,即使你删掉了还会有这条提交记录,处理起来会很麻烦。

    其二,如果我们要在我们本地新开一个项目,这个项目也需要引用一样的数据库配置文件,或许我们可以找到第一个项目的文件夹,复制出 config.py 到 新的项目文件夹。嗯,看起来可行,但是,如果你要新开十几个项目呢,几百个项目呢?

    因此我们可以引入下一种配置管理的方式,对解决上面提出的两个问题都是较为友好的解决方案,即使用环境变量,各种开发环境(Win、Mac、Linux)的系统环境变量的设置方式有所不同,可以参考这篇文章。

    另外 PyCharm 和 VS Code 有更加方便的配置方式,可以为不同的项目分配不同的设置。

    PyCharm 中,在菜单 Run->Edit configurations 中,手动设置Environment variables

    VS Code 中,在 Setting 中搜索 env ,在 Terminal 中选择你的操作系统相关的Terminal > Integrated > Env: Your OS ,点进 settings.json 进行添加

    使用环境变量配置值不用作为单独的文件进行管理,因此有较小的安全风险,它很容易使用,可以在你的开发环境中的任何项目任何代码库中使用,但是它的管理方式可能有些复杂。有些环境无法使用环境变量,比如Apache,Nginx等Web服务器,这时候就需要采用其他的方式。

    2.4 使用动态加载

    这种方法比利用 Python 内置的数据结构更加先进,内置数据结构的方法要求配置文件必须要在可以直接 import 的路径上。但是动态加载中,配置文件不必在可直接导入的路径上,甚至可以位于其他存储库中,这样的话,配置文件就和项目分隔开了,其他的项目也可以动态加载这个配置文件,例如:

    # /opt/settings/config.py

    DATABASE_CONFIG = {

    "host": "localhost",

    "dbname": "company",

    "user": "user",

    "password": "password",

    "port": 3306

    }

    # main.py

    import sys

    import pymysql

    sys.path.append("/opt/settings")

    import config

    def connect_db(dbname):

    if dbname != config.DATABASE_CONFIG["dbname"]:

    raise ValueError("Couldn"t not find DB with given name")

    conn = pymysql.connect(host=config.DATABASE_CONFIG["host"],

    user=config.DATABASE_CONFIG["user"],

    password=config.DATABASE_CONFIG["password"],

    db=config.DATABASE_CONFIG["dbname"])

    return conn

    connect_db("company")

    三、总结

    以上归纳了四种配置管理的方式,总体来说没有优劣之分,看个人的需要,甚至上面的几种方法可以混合使用,对于一些软件项目,它自身可能就提供了相关的变量配置入口,比如 airbnb 的 Airflow 。而且,当系统规模非常大时,最好使用主要提供配置管理的第三方工具或服务,相关服务可以参考这里。

    Reference

    展开全文
  • 一般来说,我们打开一个文件需要的操作三步 打开 --> 操作 --> 关闭 一.打开文件的方法 open() 方法: Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,...

    一般来说,我们打开一个文件需要做的操作三步
    打开 --> 操作 --> 关闭

    一.打开文件的方法

    open() 方法:
    Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

    注意:

    使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
    open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

    mode参数常用的有

    模式 描述
    t 文本模式 (默认)。
    x 写模式,新建一个文件,如果该文件已存在则会报错。
    b 二进制模式。
    + 打开一个文件进行更新(可读可写)。
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    默认为文本模式,如果要以二进制模式打开,加上 b 。

    简单示例:

    f = open('/tmp/passwd','r+')			##以r+模式打开/tmp/passwd
    
    print(f.tell())							#查看当前指针所在的位置
    f.write('python')
    
    print(f.tell())
    content = f.read()
    print(content)
    
    f.close()
    

    执行结果:

    0
    6
    :0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    .........				##此处省略
    

    可以看到写入的python并没有显示出来
    是因为指针位置的问题
    解决方法:
    将指针移动到指定位置即可(在下面会提到)

    二.文件常用操作

    文件读取操作

    f = open('/tmp/passwd','rb+')
    
    print(f.read())							##直接打印出来
    print(f.readline())						##打印第一行
    print(f.readlines())					
    #readlines():读取文件内容,返回一个列表,列表的元素分别为文件行内容
    
    ==我们的shell中有查看文件前几行的命令:head -c 4 /etc/passwd==
    print(f.read(4))		#读取文件前4个字符
    print(f.readline(),end='')
    print(f.readlines(),end='')
    print([line.strip() for line in f.readlines()])
    f.close()
    

    默认情况下读取文件的所有内容,小文件可以直接用read读取,如果 是大文件(文件大小>内存大小),不能通过read一次性读取所有内容

    文件的写入操作

    f.write('hello')
    f.writelines(['a','b']) #将列表里的每个元素写入文件
    print(f.tell())
    print(f.read(3))		#从指针位置起读取3个字符
    print(f.tell())
    

    移动文件指针
    简单示例:

    f.seek(-1,2)
    print(f.read())
    print(f.tell())
    f.close()
    

    执行结果:

    b'\n'
    2330
    

    seek方法 -移动指针
    seek的第一个参数是偏移量:>0,表示向右移动,<0表示向左移动
    seek的第二个参数是:
    0:移动指针到文件开头
    1:不移动指针
    2:移动指针到末尾

    非纯文本文件读取

    f1 = open('hello.png',mode='rb')
    content = f1.read()
    f1.close()
    
    f2 = open('111.jpg',mode='wb')
    f2.write(content)
    f2.close()
    

    小练习:

    题目:
    生成100个MAC地址并写入文件中,MAC地址前6位(16进制)为01-AF-3B
    01-AF-3B
    01-AF-3B-xx
    01-AF-3B-xx-xx
    01-AF-3B-xx-xx-xx

    import string
    import random
    def create_mac():
        mac = '01-AF-3B'
        for i in range(3):
            n = random.sample(string.hexdigits,2)
            sn = '-' + ''.join(n).upper()
            mac += sn
        return mac
    
    
    with open('mac.txt','w+') as f:
        for i in range(100):
            mac = create_mac()
            print(mac)
            f.write(mac+'\n')
    

    上下文管理器

    打开文件的方式(二)

    with open('/tmp/passwd') as f:		
    #使用这种文件的打开方式更加简单了,同时可以避免忘记关闭文件的情况
        print(f.read())
    

    同时打开两个文件

    with open('/tmp/passwd') as f1,\
        open('/tmp/passwd1','w+') as f2:
        #将第一个文件的内容写入第二个文件中
        f2.write(f1.read())
        #移动指针到文件最开始
        f2.seek(0)
        #读取文件内容
        print(f2.read())
    

    练习:
    题目:
    创建文件data.txt,文件共100000行,每行存放一个1~100之间的整数

    import random
    
    f = open('data.txt','w+')
    for i in range(100000):
        f.write(str(random.randint(1,100)) + '\n')
    
    f.seek(0)
    print(f.read())
    f.close()
    

    三.系统文件管理

    import os
    from os.path import exists,splitext,join

    1.返回操作系统类型值:posix,表示linux操作系统,如果是nt,是windows操作系统
    print(os.name)

    2.操作系统的详细信息
    info = os.uname()
    print(info)
    print(info.sysname)
    print(info.nodename)

    3.系统环境变量
    print(os.environ)

    4.通过key值获取环境变量对应的value值
    print(os.environ.get(‘PATH’))

    5.判断是否为绝对路径
    print(os.path.isabs(’/tmp/westos’))
    print(os.path.isabs(‘data.txt’))

    6.生成绝对路径
    print(os.path.abspath(‘hello.png’))
    print(os.path.join(’/home/kiosk’,‘hello.png’))
    print(os.path.join(os.path.abspath(’.’),‘hello.jpg’))

    7.获取目录名或文件名
    filename = ‘/home/kiosk/PycharmProjects/20190316/day07/hello.png’

    print(os.path.basename(filename))
    print(os.path.dirname(filename))

    8.创建目录/删除目录
    os.mkdir(‘img’)
    os.makedirs(‘img/jpg/png’)
    os.rmdir(‘img’)

    9.创建文件/删除文件
    os.mknod(‘aa.txt’)
    os.remove(‘aa.txt’)

    10.文件重命名
    os.rename(‘data.txt’,‘data1.txt’)

    11.判断文件或者目录是否存在
    print(os.path.exists(‘data1.txt’))

    12.分离后缀名和文件名
    print(os.path.splitext(‘hello.png’))

    13.将目录名和文件名分离
    print(os.path.split(’/tmp/hello/python.jpg’))

    四.练习

    题目一:

    1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
    2. 将当前img目录所有以.png结尾的后缀名改为.jpg.
    import os
    from os.path import exists,splitext,join
    import random
    import string
    
    def gen_code(len=4):
        #随机生成4位验证码
        li = random.sample(string.ascii_letters + string.digits,len)
        #将列表元素拼接为字符串
        return ''.join(li)
    
    
    def create_files():
        #随机生成100个验证码
        li = [gen_code() for i in range(100)]
        os.mkdir('img')
        for name in li:
            os.mknod('img/' + name + '.png')
    
    # create_files()
    
    def modify_suffix(dirname,old_suffix,new_suffix):
        """
    
        :param dirname: 要操作的目录
        :param old_suffix: 之前的后缀名
        :param new_suffix: 新的后缀名
        :return:
        """
        if os.path.exists(dirname):
            #找出所有以old_suffix结尾的文件名
            pngfile = filter(lambda filename:filename.endswith(old_suffix),os.listdir(dirname))
    
            #将文件名和后缀分开
            basefiles = [os.path.splitext(filename)[0] for filename in pngfile]
    
            #文件重命名
            for filename in basefiles:
                oldname = os.path.join(dirname,filename+old_suffix)
                newname = os.path.join(dirname,filename+new_suffix)
                os.rename(oldname,newname)
                print('%s重命名为%s成功' %(oldname,newname))
    
        else:
            print('%s不存在,无法操作...' %dirname)
    
    
    modify_suffix('dir','.jpg','.png')
    

    题目二:

    1. 生成一个大文件ips.txt,要求1200行, 每行随机为172.25.254.0/24段的ip;
    2. 读取ips.txt文件统计这个文件中ip出现频率排前10的ip;
    import random
    
    def create_ip_file(filename):
        ip =['172.25.254.' + str(i) for i in range(0,255)]
        print(random.sample(ip,1))
    # print(ip)
        with open(filename,'a+') as f:
            for count in range(1200):
                f.write(random.sample(ip,1)[0] + '\n')
    
    # create_ip_file('ips.txt')
    
    def sorted_by_ip(filename,count=10):
        ips_dict = dict()
        with open(filename) as f:
            for ip in f:
                if ip in ips_dict:
                    ips_dict[ip] += 1
                else:
                    ips_dict[ip] = 1
    
        sorted_ip = sorted(ips_dict.items(),key=lambda x:x[1],reverse=True)[:count]
        return sorted_ip
    
    print(sorted_by_ip('ips.txt'))
    
    展开全文
  • 可以直接使用的工程文件,是一个入门级别的python系统工程,由于的相对简单适合入门的新手参考使用,请各位参考,使用方法已经上传.
  • python餐厅管理系统.zip

    2019-11-18 16:23:27
    1、简单的餐厅管理系统 2、纯dos界面 3、除了主程序program,其它文件默认放在python安装路径下;亦可修改代码路径 4、留了一个bug,厨师增加菜品如何同步到restaurant文件中?自己一下 5、互相学习,有什么...
  • 南墙学习python也有一段日子了,虽然也过爬虫实战,总感觉少了些什么,于是乎,给自己找了个小项目,这是一个命令行下的成绩管理系统,没有界面写起来就比较简单,专注业务逻辑开发。灵感来源于大一的c语言链表...
  • Python系统管理

    2019-10-03 03:43:22
    系统管理四个模块:os os.path glob fnmatchos:包含大部分linux管理命令os.path:操作系统目录和文件操作glob:linux下的通配符fnmatch:文件名匹配 os模块包含普遍的操作系统功能,如果希望程序能够与平台无关的话...
  • 前面写了一个用字符串拼接实现, 字符串拼接方式. 现在带大家来看一下字典文件形式实现这个系统 ...欢迎使用【名片管理系统】V1.0&quot;) print(&quot;&quot;) print(&quot;1.新建名片&a
  • 最近了一个简单的文件传输系统,基于ftp协议,使用python语言开发,虽然python里面已经有ftplib模块,可以很容易的实现ftp服务器。这次我使用的是socket实现client与ftp server之间的通讯和文件传输,client另起一...
  • python用户管理系统

    千次阅读 2017-12-23 23:46:19
    我还是把我的流程图拿出来吧,虽然看着比上次的垃圾,但是我也了一个小时,不容易! 好像是挺丑的(表示不会画,但我下次一定努力) 用户文件文件名为:user.txt 1代表管理员用户 2代表普通用户...
  • python员工入职信息管理系统 用sql的,包含源码,图片以及sql数据库等信息 文件压缩包,百度网盘自提 链接:https://pan.baidu.com/s/1GGAHvPRUgSZAvLzz1Gdmtg 提取码:fvsy
  • Python 名片管理系统

    2018-07-19 11:02:19
    先建立cards_main的文件 import cards_tools #无限循环,由用户主动决定什么时候退出 while True: #TODO注释,用于标记需要去的工作 cards_tools.show_menu() action_str = raw_input(&quot;请选择希望...
  • python简单的学生信息管理系统-文件版,供大家参考,具体内容如下 功能如下 主函数部分 增加学生信息 修改学生信息 删除学生信息 查询学生 显示所有学生的信息 将数据录入文件 读取文件数据 学习文件模块后,将之前...
  • 首先了一个流程图,可能也不符合啥规范,就当草稿用,将就着看,明白个设计思路就行。 1.首先系统初始化,定义时间戳A,定义一些变量。再设置一个默认账户,这里账户用字典的形式表示。 复制代码 1 import time 2...
  • Python这么久了,第一次写一个这么多的代码(我承认只有300多行,重复的代码挺多的,我承认我确实垃圾),但是也挺不容易的 自定义函数+装饰器,每一个模块写的一个函数 很多地方能用装饰器(逻辑跟不上,有的地方...
  • 简单版本学生信息管理系统,用python基础语法实现,基于python 3.6 容错率很高的代码,了很多异常处理功能,出错也不会丢失信息 启动时自动从文件中读取已有学生信息,退出时自动保存 程序分3个模块: Menu:进行...
  • Python成绩管理系统:1、包括增、删、改、查 2、拥有简易UI界面 3、数据使用CSV文件存储 4、不包含数据库,5适合大学生上完这个课程制作,6适合课程设计
  • 该图书管理系统为练习阶段所,能够实现图书详情的查询、图书的添加、图书的删除功能。以下附源码:views.py文件中代码如下:from django.shortcuts import render,redirect,reversefrom django.db import con...
  • *学生管理系统*对于当前的学生来说都是学习必备,刷题必备,基本学一个语言就要一个*学生管理系统*,方法无疑就是在本地创建一个txt文件然后写入以及读取其内容。然而*缺点*也随即出现,无论什么语言,都会极大地...
  • Fabric是基于Python 2.5及以上版本实现的SSH命令行工具,简化了SSH了应用程序部署及系统管理任务,它提供了系统基础的操作组件,可以实现本地或远程shell命令,包括命令执行,文件上传,下载及完整执行日志输出等...
  • 用于在文件系统上使用Foundry VTT world资产的Python CLI。 FWT在运行时通常会两件事: 第一,它移动文件,第二,它通过搜索和替换用文件的新位置更新铸造数据库。 对于重复的文件,FWT不会删除文件,如果要删除...
  • -建立两个python文件: card_main.py card_toos.py card_main.py 代码如下: #! /usr/bin/python3 import cards_toos while True: # 显示功能菜单 cards_toos.show_menu() action_str = input("请选择希望...
  • 但是以上模块还是不够,一个管理系统应该还有一个具有更高权限的管理帐号,它具备以上的功能之外 还能看谁了什么操作,删除,添加用户等等。 所以我们再添加以下模块: 1 添加用户 2 删除用户 3 修改用户 4 监控...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 470
精华内容 188
关键字:

python做文件管理系统

python 订阅