正则表达式与CSV文件操作

从云班课平台中导出的学生作业为zip文件,解压后是一个作业文件夹,在其中的学生子目录(按学号+姓名命名)中有.html文件。希望将所有学生的答案以csv格式保存、方便对比批阅。正好复习《Python爬虫开发 从入门到实战(微课版)》,稍微改改第3章正则表达式与文件操作的案例代码完成了作业汇总的任务。

import os
import re
# import csv
import pandas as pd

t_dir=r'D:\Users\yuanyujie\Documents\Downloads\旅管本191-旅游研究方法-专业兴趣与问题调查' #指定文件夹
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打开时中文会显示乱码。

Python批量图片转PDF

LP所教课程的在线期末考试结束,教秘按教学班汇总,试卷照片在教学班文件夹的学生子目录(按学号+姓名+专业+年级+班次命名)中。LP阅卷若直接浏览图片要点击更换目录,这也不方便保存批阅记录。针对以上问题,我用python编程将每个子目录内的图片转pdf,同时以学号+姓名方式保存。最后手工在Acrobat pro中合并,旋转少数横拍的页面,得到每个班级的试卷pdf文件。

在Python中图片转pdf用第三方库pymupdf,第一天用pip或conda直接安装都报错,然后从pypi下载.whl安装也报错。第二天参考《Python将图片转成pdf(高清)论文党用~》输入命令,安装进行一段后还是报错。但是,从安装命令指定镜像得到启发,首先参考《Anaconda安装详解、配置清华镜像和常用命令行集锦》设置镜像,但是conda安装还是出错。于是再改用pip安装.whl文件,依然报错。看到pymupdf文档提示”The wheels are self-contained, i.e. you will not need any other software nor download / install MuPDF to run PyMuPDF scripts.”,于是百度该错误提示,结果发现是版本不对的原因,重新在pypi中下载Python3.7的.whl文件,pip安装成功。以上安装第三方库走了好多弯路。

接下来参考《Python 图片与pdf相互转换》,《python获取某目录下(含子目录)所有文件名称》以及《Python中os.walk函数的用法(遍历文件夹下文件并获得路径)》,写完代码比较顺利的一遍跑通。代码如下:

import os
import fitz

t_dir=r'E:\教学\资源与环境经济学1802'            #指定班级文件夹

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)):
            print(s_dir[:len(s_dir)-12], sub_files)
            doc = fitz.open()
            d_name=os.path.join(root,s_dir[:len(s_dir)-12])
            for f_list in sub_files:
                img_name=os.path.join(root,s_dir,f_list)
                imgdoc = fitz.open(img_name)     # 打开图片
                pdfbytes = imgdoc.convertToPDF() # 使用图片创建单页的 PDF
                imgpdf = fitz.open("pdf", pdfbytes)
                doc.insertPDF(imgpdf)            # 将当前页插入文档
            doc.save(d_name + ".pdf")            # 保存pdf文件
            doc.close()

四个班级中各位学生的试卷照片都在班级文件夹中转换为单独的pdf,再用Acrobat pro合并与旋转调整页面,然后发给LP用福昕阅读器批改。