Back
Featured image of post python3 | openpyxl的简单应用1

python3 | openpyxl的简单应用1

第一次用,还得再多做题

背景

基于函数实现用户认证,要求:

  • 写函数,读取的用户信息并构造为字典(用户信息存放在files/user.xlsx文件中)6

    # 方法1,比较麻烦,
    import openpyxl
    def get_user_dict():
        list = []
        name_list = []
        pwd_list = []
        user = openpyxl.load_workbook("files/user.xlsx")
        sheet = user.get_sheet_by_name('Sheet1')#通过sheet的name去找到sheet
    
        for i in range(2,5):# 手工去选取了内容范围
            for j in range(2,4):
                list.append(sheet.cell(row=i,column=j).value)# 范围内的内容加入到list
        for i in range(0,len(list)):#分类,分成两个list
            if i%2 == 0:
                name_list.append(list[i])
            else:
                pwd_list.append(list[i])
        user_dict = dict(zip(name_list,pwd_list))# 两个list合并为一个dict
        return user_dict
    print(get_user_dict())
    

    这个方法,采用get_sheet_by_name的方法是参考的:Python Excel,Openpyxl Tutorial

    思路是:

    • 获取全部信息list
    • 将信息分成key和value两个list
    • 两个list用zip和dict来合并
    # 方法2,教程的解法
    import openpyxl
    def get_user_dict():
        user_dict = {}
        wb = openpyxl.load_workbook("files/user.xlsx")	#打开已经存在的文件
        sheet = wb.worksheets[0]	#通过index去找到sheet
        for row in sheet.rows:	# 直接读row
            user_dict[row[1].value] = row[2].value
        return user_dict
    print(get_user_dict())
    

    这个方法是教程提供的解法,也是采用的openpyxl这个库

    最后和我的数据比起来,多取了一个tittle,但代码上明显要简洁很多。

  • 用户输入用户名和密码,进行校验。(且密码都是密文,所以,需要将用户输入的密码进行加密,然后再与Excel中的密文密码进行比较)

    • 这个基本就等同于是登录的验证。

      import openpyxl
      import hashlib
      def get_user_dict():
          user_dict = {}
          wb = openpyxl.load_workbook("files/user.xlsx")
          sheet = wb.worksheets[0]
          for row in sheet.rows:
              user_dict[row[1].value] = row[2].value
          return user_dict
      
      def encrypt(origin):		#这部分是直教程提供的,接拿过来用,没有自己查写
          origin_bytes = origin.encode('utf-8')
          md5_object = hashlib.md5()
          md5_object.update(origin_bytes)
          return md5_object.hexdigest()
      
      if __name__ == '__main__':
          print("please enter the username")
          username = input("username:")
          pwd = input("password:")
          md5_pwd = encrypt(pwd)
          user_dict = get_user_dict()
          if username in user_dict:		#这里按道理可以做一个无限循环,正确才能录入
              if user_dict[username] == md5_pwd:	#密码正确
                  print("login success")
              else:
                  print("pwd error")		# 密码错误
          else:
              print("user no exited")		#用户不存在的话提示用户不存在
      
  • 用户注册,把信息存进已经存在excel里,也就是追加。必须是密文存进去。

    • openpyxl基本上到cell这个粒度,就可以赋值value了

    • 一个难点是怎么追加到当前excel的最后一行,在python里用openpyxl获取到xlsx的当前行数和列数

      import openpyxl
      import hashlib
      def get_user_dict():
          user_dict = {}
          wb = openpyxl.load_workbook("files/user.xlsx")
          sheet = wb.worksheets[0]
          for row in sheet.rows:
              user_dict[row[1].value] = row[2].value
          return user_dict
      
      def encrypt(origin):
          origin_bytes = origin.encode('utf-8')
          md5_object = hashlib.md5()
          md5_object.update(origin_bytes)
          return md5_object.hexdigest()
      
      def save_new_user(name,pwd):	#这里是保存的函数
      
          wb = openpyxl.load_workbook("files/user.xlsx")
          sheet = wb.worksheets[0]
          line = str(sheet.max_row+1)	# 获取到最新的行数,+1.表明是这次操作的目标
          sheet['B'+line] = name	#这里只接受字符串,因此是拼接的
          sheet['C'+line] = pwd
          wb.save("files/user.xlsx")	# 这个是保存文件的操作
      
      if __name__ == '__main__':
          user_dict = get_user_dict()
          print("please enter the username")
          while True:		# 加这个是让一直输入正确才进行下去。
              username = input("username:")
              if username in user_dict:	# 如果输入的用户名字已经存在
                  print("The user name already exists,please re-enter")
              else:
                  break
          while True:
              pwd1 = input("password 1 times:")
              pwd2 = input("password 2 times:")
              if pwd1 == pwd2:	#两次密码要相等才能存
                  md5_pwd = encrypt(pwd2)
                  break
              else:
                  print("The two passwords are different. Please re-enter them")
          save_new_user(username,md5_pwd)
      

扩展

其实搜关键字出来的都是pandas这个库,看了一眼,还是比较复杂。

没看文档之前,以为是个比较高级字典、list之类的。总之for应该能解决吧?结果print暴力看了几层的type,我觉得,目前的水平,看官方文档可能不如直接SOF。

但是用途很广泛,搞数据分析和科研的常用。考虑到不加openpyxl得到的搜索引擎结果,靠前其实都是pandas解法。感觉需要处理数据的话,这个应该是逃不掉的。

  • Joyful-Pandas 这个是看到的教程,感觉比较细,有大量的练习。
  • pandas documentation 蛮多内容的,看不懂
  • DataScience Made Simple 这个感觉是个数据科学方面的总结网站,有不少数据处理相关的内容,基本就围绕数据,是我喜欢的那种英文教学网站。

另外查找openpyxl的资料有几个网站还挺好:

  • Openpyxl Tutorial 这个网站有一种直播式的观看感,非常细,但是不全。
  • Python Openpyxl 这个也提供了另外一种追加数据的思路,(看了没试)
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy