当前位置:   article > 正文

Python对腾讯问卷进行打卡核对_python能不能访问腾讯问卷

python能不能访问腾讯问卷

日期2022.3.28

目录

1、从腾讯问卷导出CSV数据

2、Python实现一天打卡(需手动下载数据,并解压重命名)

3、Python实现连续多天打卡检测(需手动下载数据,并解压重命名)

4、url下载文件,打卡检测(未成功)

5、改进Python实现连续多天打卡检测(仅需手动下载数据,然后运行)


1、从腾讯问卷导出CSV数据

将全部打卡人数的信息,放入benkeshen文件夹,一行一个名字

运行python程序,得出结果

2、Python实现一天打卡(需手动下载数据,并解压重命名)

  1. import csv
  2. time = r"2022/3/22"
  3. # 读取第一个文件name
  4. with open(r'C:\Users\14193\Desktop\benkesheng.txt', 'r', encoding='utf-8') as f1:
  5. name = f1.read()
  6. # 将字符串name 切片成 list
  7. name = name.split()
  8. print(f"人数:\t{len(name)}")
  9. # 读取第二个文件
  10. with open(r'C:\Users\14193\Desktop\1.csv', 'r', encoding='utf-8') as f2:
  11. reader = csv.reader(f2)
  12. # 略过第一行
  13. next(reader)
  14. # 逐行遍历剩下的每行数据
  15. for row in reader:
  16. # 对比所需找的日期 将出现的name删除
  17. if time in row[2] and row[11] in name:
  18. name.remove(row[11])
  19. # 直接在控制台输出结果
  20. print(f"未打卡:\t{name}")
  21. # 将结果输出到文件中
  22. with open(r'C:\Users\14193\Desktop\result.txt', 'w', encoding='utf-8') as f3:
  23. # 逐行遍历name
  24. for row in name:
  25. f3.write(row)
  26. f3.write("\n")

3、Python实现连续多天打卡检测(需手动下载数据,并解压重命名)

  1. import os
  2. root = os.getcwd()#获取当前文件执行路径
  3. import csv
  4. from datetime import datetime, timedelta
  5. # 开始日期的前一天
  6. start = datetime.strptime("20-Mar-2022", "%d-%b-%Y")
  7. now = datetime.strftime(datetime.now(), "%d-%b-%Y")
  8. # 重置结束日期为0点0分0秒
  9. end = datetime.strptime(now, "%d-%b-%Y")
  10. print(f"输出一下日期格式\n{start}\n{end}")
  11. print(f"今天打卡日期:\t{now}")
  12. timeList = []
  13. temp = end
  14. while temp != start:
  15. # 转化为字符串格式,放入列表中
  16. timeList.append(datetime.strftime(temp, "%d-%b-%Y"))
  17. # 向前推一天
  18. temp = temp - timedelta(days=1)
  19. print(f"日历列表如下:\n{timeList}")
  20. print(f"打卡天数:\t{len(timeList)}")
  21. print(f"打卡开始日期:\t{timeList[len(timeList) - 1]}")
  22. print(f"打卡结束日期:\t{timeList[0]}")
  23. # 读取第一个文件name,包含全部打卡人员名字
  24. with open(root + '\\benkesheng.txt', 'r', encoding='utf-8') as f1:
  25. name = f1.read()
  26. # 将字符串 name 切片成 list
  27. name = name.split()
  28. print(f"总人数:\t{len(name)}")
  29. # 存放全部日期未打卡人员的名字,即每一天
  30. notFindName = []
  31. # 读取第二个文件
  32. with open(root + '\\1.csv', 'r', encoding='utf-8') as f2:
  33. reader = csv.reader(f2)
  34. # 略过第一行
  35. next(reader)
  36. # 一天未打卡人员名字,结果中包含所有名字,打卡的则从中剔除,剩下即为未打卡
  37. res = name[:]
  38. # 逐行遍历剩下的每行数据
  39. i = 0
  40. for row in reader:
  41. # 打印文件中的时间格式
  42. # print(row[2])
  43. # 找到对应的日期
  44. while timeList[i] not in row[2]:
  45. if len(res) != len(name):
  46. # 控制台输出
  47. print(f"{timeList[i]}未打卡人数:\t{len(res)}\n{res}")
  48. # 结果放入列表中,最后读入文件
  49. notFindName.append(res)
  50. # 下一天的打卡信息
  51. i += 1
  52. res = name[:]
  53. # 打卡的则从中剔除,剩下即为未打卡
  54. if row[11] in res:
  55. res.remove(row[11])
  56. # 输出最早的一天数据
  57. notFindName.append(res)
  58. print(f"{timeList[i]}未打卡人数:\t{len(res)}\n{res}")
  59. # 将结果输出到文件中
  60. with open(root + '\\result.txt', 'w', encoding='utf-8') as f3:
  61. # 逐行遍历日期列表timeList
  62. for i in range(len(timeList)):
  63. f3.write(f"{timeList[i]}未打卡人数:\t{len(notFindName[i])}\n{notFindName[i]}\n")

4、url下载文件,打卡检测(未成功)

因为腾讯问卷的url时刻变化,

实现后发现,腾讯问卷导出数据的链接,每次都不一样,因此通过同一个url下载的数据一致,无法动态检测。

因此还需手动点击下载数据

  1. root = os.getcwd() # 获取当前文件执行路径
  2. url = r'https://wj-collection-1258344706.cos-website.ap-guangzhou.myqcloud.com/export/answer/9501508_202205091414576686.csv.zip?sign=q-sign-algorithm%3Dsha1%26q-ak%3DAKID3dz5uN4cMpGamjMvBaySkOoxwmMgMacO%26q-sign-time%3D1652076839%3B1652098499%26q-key-time%3D1652076839%3B1652098499%26q-header-list%3Dhost%26q-url-param-list%3D%26q-signature%3D4954e92a16074b56f7812697c298c238c5a5aa2b&_=1652076899732'
  3. # 下载文件到本地的路径,拼接路径,等价于 root \ 文件名
  4. zippath = os.path.join(root, '9501508_202205091414576686.zip')
  5. urllib.request.urlretrieve(url, zippath) # 下载文件
  6. with zipfile.ZipFile(zippath, 'r') as zip: # 解压文件
  7. zip.extractall(root) # 压缩包内文件全部解压到root目录
  8. # 压缩包文件名,拼接成路径,等价于 root \ 文件名
  9. datafile = os.path.join(root, zip.namelist()[0])
  10. # 删除压缩文件
  11. # os.remove(zippath)
  12. # 删除解压后的文件
  13. # os.remove(datafile)

5、改进Python实现连续多天打卡检测(仅需手动下载数据,然后运行)

默认下载路径:C:\Users\Lenovo\Downloads

在该路径下找csv.zip压缩包,然后解压,读取解压文件,然后删除压缩包和数据文件。

每次运行前,需要下载好数据压缩包

  1. from datetime import datetime, timedelta
  2. import csv
  3. import zipfile
  4. import os
  5. # 生成打卡日期的timeList
  6. def makeTimeList(start, end, timeList):
  7. temp = end
  8. while temp != start:
  9. # 转化为字符串格式,放入列表中
  10. timeList.append(datetime.strftime(temp, "%d-%b-%Y"))
  11. # 向前推一天
  12. temp = temp - timedelta(days=1)
  13. print(f"日历列表如下:\n{timeList}")
  14. print(f"打卡天数:\t{len(timeList)}")
  15. print(f"打卡开始日期:\t{timeList[len(timeList) - 1]}")
  16. print(f"打卡结束日期:\t{timeList[0]}")
  17. # 从文件一,读取名字list
  18. def getName(root):
  19. # 读取第一个文件name,包含全部打卡人员名字
  20. with open(root + '\\name.txt', 'r', encoding='utf-8') as f1:
  21. name = f1.read()
  22. # 将字符串 name 切片成 list
  23. name = name.split()
  24. return name
  25. # 解压文件,返回解压后的数据文件路径
  26. def zipFile(root):
  27. downloadpath = r'C:' + os.environ['HOMEPATH'] + r'\Downloads' # 下载的压缩包所在路径
  28. # 遍历当前路径的文件列表
  29. for i in os.listdir(downloadpath):
  30. if '.csv.zip' in i:
  31. zippath = os.path.join(downloadpath, i) # 压缩包文件名,拼接成路径
  32. break
  33. # 解压文件
  34. with zipfile.ZipFile(zippath, 'r') as zip:
  35. zip.extractall(downloadpath) # 压缩包内文件全部解压到downloadpath目录
  36. # 压缩包解压后文件名,拼接成路径
  37. datafile = os.path.join(downloadpath, zip.namelist()[0])
  38. os.remove(zippath)
  39. return datafile
  40. # 读取数据文件,找到每天未打卡的名字
  41. def FindName(notFindName, name, timeList):
  42. with open(datafile, 'r', encoding='utf-8') as f2:
  43. reader = csv.reader(f2)
  44. # 略过第一行各种标签行
  45. next(reader)
  46. # 一天未打卡人员名字,结果中包含所有名字,打卡的则从中剔除,剩下即为未打卡
  47. res = name[:]
  48. # 逐行遍历剩下的每行数据
  49. i = 0
  50. for row in reader:
  51. # 打印文件中的时间格式
  52. # print(row[2])
  53. # 找到对应的日期
  54. while timeList[i] not in row[2]:
  55. # 结果放入列表中,最后读入文件
  56. notFindName.append(res)
  57. #print(i, ' ', len(notFindName))
  58. # 下一天的打卡信息
  59. i += 1
  60. res = name[:]
  61. # 打卡的则从中剔除,剩下即为未打卡
  62. if row[11] in res:
  63. res.remove(row[11])
  64. # 输出最早的一天的结果加入
  65. notFindName.append(res)
  66. # print(len(notFindName))
  67. # 对未找到的名字,进行统计,返回统计的字典
  68. def countNUm(dic, notFindName):
  69. for i in notFindName:
  70. for j in i:
  71. if j not in dic:
  72. dic[j] = 1
  73. else:
  74. dic[j] += 1
  75. # 按照字典值降序排列,次数为临时的字典,需要使用deepcopy, 或者返回赋值
  76. return {k: v for k, v in sorted(dic.items(), key=lambda item: item[1], reverse=True)}
  77. # 将结果输出到文件中
  78. def outputToFileAndConsole(root, dic, timeList, notFindName):
  79. with open(root + '\\result.txt', 'w', encoding='utf-8') as f3:
  80. f3.write(f'打卡的总次数\t{len(timeList)}\n未打卡的统计次数\n')
  81. # 控制台输出
  82. print(f'打卡的总次数\t{len(timeList)}\n未打卡的统计次数\n', end='')
  83. # 逐行遍历日期列表timeList
  84. i = 0
  85. for key, value in dic.items():
  86. f3.write(
  87. f'{key}:\t{value}\t')
  88. print(f'{key}:\t{value}\t', end='')
  89. i += 1 # 控制输出格式5个输出一行
  90. if i % 5 == 0:
  91. f3.write(f'\n')
  92. print()
  93. f3.write(f'\n\n\n')
  94. print(f'\n\n\n', end='')
  95. print(len(timeList), len(notFindName))
  96. # 逐行遍历日期列表timeList
  97. for i in range(len(timeList)):
  98. f3.write(
  99. f'{timeList[i]}未打卡人数:\t{len(notFindName[i])}\n{notFindName[i]}\n')
  100. print(
  101. f'{timeList[i]}未打卡人数:\t{len(notFindName[i])}\n{notFindName[i]}\n', end='')
  102. # 开始日期的前一天
  103. start = datetime.strptime("20-Mar-2022", "%d-%b-%Y")
  104. now = datetime.strftime(datetime.now(), "%d-%b-%Y")
  105. # 重置结束日期为0点0分0秒
  106. end = datetime.strptime(now, "%d-%b-%Y")
  107. print(f'输出一下日期格式\n{start}\n{end}')
  108. print(f'今天打卡日期:\t{now}')
  109. timeList = []
  110. # 获取日期timelist
  111. makeTimeList(start, end, timeList)
  112. # 获取当前文件执行路径
  113. root = os.getcwd()
  114. # 解压后返回数据文件路径
  115. datafile = zipFile(root)
  116. # 从文件获取名字list
  117. name = getName(root)
  118. # 存放全部日期未打卡人员的名字,即每一天
  119. notFindName = []
  120. FindName(notFindName, name, timeList)
  121. # 删除csv数据文件
  122. os.remove(datafile)
  123. # 结果使用字典进行计数并输出
  124. dic = {}
  125. dic = countNUm(dic, notFindName)
  126. outputToFileAndConsole(root, dic, timeList, notFindName)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/605936
推荐阅读
相关标签
  

闽ICP备14008679号