从云班课平台中导出的学生作业为zip文件,解压后是一个作业文件夹,在其中的学生子目录(按学号+姓名命名)中有.html文件。希望将所有学生的答案以csv格式保存、方便对比批阅。正好复习《Python爬虫开发 从入门到实战(微课版)》,稍微改改第3章正则表达式与文件操作的案例代码完成了作业汇总的任务。
import os
import re
# import csv
import pandas as pd
t_dir=r'D:\Users\yuanyujie\Documents\Downloads\旅管本19(1)-旅游研究方法-专业兴趣与问题调查' #指定文件夹
result_list= [] #提取所需到包含字典的列表
for root, dirs, files in os.walk(t_dir):
for s_dir in dirs:
for sub_root, sub_dirs, sub_files in os.walk(os.path.join(root,s_dir)): #遍历子目录与文件
for f_list in sub_files:
if f_list[-4:]=="html":
print(s_dir, f_list)
url=os.path.join(root,s_dir,f_list) #文件绝对路径
print(url)
htmlf = open(url,'r',encoding='utf-8') #打开文件
htmlcont = htmlf.read() #读取文件内容
content_list=re.findall('<span>(.*?)<',htmlcont,re.S) #正则表达式
name_list=s_dir[13:]
num_list=s_dir[:12]
result = {'num':num_list,
'name':name_list,
'content':content_list
}
result_list.append(result) #列表追加元素字典
print(result_list)
df = pd.DataFrame(result_list) #包含字典的列表直接转Dataframe
print(df)
os.chdir(t_dir) #指定工作目录
df.to_csv('test.csv',encoding='ansi') #保存csv文件
# with open('test01.csv','w',encoding='utf-8') as f:
# writer=csv.DictWriter(f,fieldnames=['num','name','content'])
# writer.writeheader()
# writer.writerows(result_list)
if os.path.exists('test.csv'):
print('Done')
else:
print('Try Again')
写代码时碰到两个问题,一是.html文件直接用open命令打开后,还需要read命令读取内容,二是文件默认保存到工作目录,需要指定目录时要用os.chdir()。此外,发现包含字典的列转成Dataframe用一行代码就行,用pandas保存csv也是直接一行代码就行。保存时注意事项是编码需要设为ANSI,用utf-8保存再用Excel打开时中文会显示乱码。