提取并处理excel保存的大量法律文书的代码

写在前面

一个学法学的同学要我帮忙写一个处理程序,我也是编程小白,奈何是相关专业的,还是答应了帮忙。
写的很丑陋,但毕竟花了不少时间写,敝帚自珍,放在这里记录一下

代码实现

数字转换部分

from cn2an import cn2an  # 用于中文数字转换
import re

# 提取罚款内容中的数字部分
def keep_specific_chars(RE_list):
    # 未匹配到
    if len(RE_list) == 0:
        return "0"
    else:
        string = RE_list[len(RE_list)-1]  # 将列表中的字符串取出
        pattern = re.compile(r'[0-9一二两三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟萬\.]*')
        results = re.findall(pattern, string)
        return ''.join(results)  # 将识别到的数字连接起来

# 将数字内容转换为阿拉伯数字,并转换为数值型
def trans(string):
    try:
        # 将中文数字转换为阿拉伯数字,并储存为浮点数类型
        return int(cn2an(string, mode = 'smart'))
    except:
        # 无法识别则返回-1
        return -1

def to_number(list):
    return trans(keep_specific_chars(list))

提取各种罪行

import re
from to_number import to_number

#一个比较大的问题是我们不知道文书中哪一段判决是最终判决,需要自己设置一下
def filter_text(text):
    strs=['并罚','决定执行']
    for str in strs:
        if str in text:
            text=text[text.index(str):]
    return text

def fine_money(text):
    text=filter_text(text)
    if '处罚金' in text:
        text=text[text.index('处罚金'):]
    else:
        return 0
    strs=[',','。',';','(','【']
    for str in strs:
        if str in text:
            text=text[:text.index(str)]
    if '元' in text:
        text=text[:text.index('元')]
    list=[text]
    return to_number(list)

#有关时间的刑罚,包括有期,缓刑,拘役,均可通过传入string进行匹配
def time_limit_prison(text,string):
    text=filter_text(text)
    if string in text:
        text=text[text.index(string):]
    else:
        return 0
    strs=[',','。',';','(','【']
    for str in strs:
        if str in text:
            text=text[:text.index(str)]
    if string!='缓刑' and '缓刑' in text:
        text=text[:text.index('缓刑')]
    #取第一个匹配到的
    string1 = string
    string2 = "年"
    string3 ='月'
    string4 ='日'
    day=0
    pattern_year = re.compile(f'{re.escape(string1)}(.*?){re.escape(string2)}')
    if '年' in text:
        pattern_month = re.compile(f'{re.escape(string2)}(.*?){re.escape(string3)}')
    else:
        pattern_month=re.compile(f'{re.escape(string1)}(.*?){re.escape(string3)}')
    if '月' in text:
        pattern_day=re.compile(f'{re.escape(string3)}(.*?){re.escape(string4)}')
        match_day=pattern_day.findall(text)
        day=to_number(match_day)
    match_year=pattern_year.findall(text)
    match_month=pattern_month.findall(text)
    year=to_number(match_year)
    month=to_number(match_month)
    if day>0:
        return 12*year+month+day/30
    else:
        return 12*year+month

if __name__ == "__main__":
    text="""被告人胡有志犯偷越国(边)境罪,判处有期徒刑六个月(刑期从判决执行之日起计算。判决执行以前先行羁押的,羁押一日折抵刑期一日,即自2023年9月2日起至2024年3月1日止),并处罚金人民币一万元(已预缴)"""
    print(f'罚金:{fine_money(text)}')
    print(f"有期徒刑:{time_limit_prison(text,'有期徒刑')}")

多个被告人,分割文本和处理函数

#定义了拆解被告人的函数
import pandas as pd
import re
import judge_crime

def judge_wanzheng(text):
    if '如不服本判决' in text:
        return 1
    else:
        return 0


# 通过数被告人...犯出现次数来判断有多少个被告人,返回的为list
def peoplelist(string):
    string1 = "被告人"
    string2 = "犯"
    if not isinstance(string, str):
        print(string)
    pattern = re.compile(f'{re.escape(string1)}(.*?){re.escape(string2)}')
    matches = pattern.findall(string)
    if not matches:
        string3='被告'
        pattern = re.compile(f'{re.escape(string3)}(.*?){re.escape(string2)}')
        matches = pattern.findall(string)
    # 过滤掉汉字字数大于10并且不包含"否认指控的"的匹配
    filtered_matches = [match for match in matches if len(re.findall('[\u4e00-\u9fff]', match)) <= 10 and ('否认指控的' not in match) and ('的行为不构成' not in match)]
    unique_matches = list(set(filtered_matches))
    return unique_matches


def countpeople(text):
    return len(peoplelist(text))

def slice_text(text):
    #用作分隔符拆分,将如不服从本判决之后的删除
    delimiter_list=peoplelist(text)
    if '如不服本判决' in text:
        text=text[:text.index('如不服本判决')]
    # 使用re.split()根据列表中的字符串进行沿左边拆分
    pattern = '|'.join(f'(?={re.escape(delimiter)})' for delimiter in delimiter_list)
    result = re.split(pattern, text)
    list1 = delimiter_list
    list2 = result[1:]
    matches = []
    for item1 in list1:
        for item2 in list2:
            if item1 in item2 :
                matches.append((item1, item2))
                break
    return matches


#将返回一个元素为['姓名','死刑','无期','有期','拘役','缓刑''罚金']的list,并转换成dataFrame形式
def dataF(text):
    #划分
    slice_list=slice_text(text)
    #创建一个空list
    final_list=[]
    for i in range(len(slice_list)):
        #先把名字放在元素中
        element=[slice_list[i][0],0,0,0,0,0,0]
        wenshu=slice_list[i][1]
        element[3]=judge_crime.time_limit_prison(wenshu,'有期徒刑')
        element[4]=judge_crime.time_limit_prison(wenshu,'拘役')
        element[5]=judge_crime.time_limit_prison(wenshu,'缓刑')
        element[6]=judge_crime.fine_money(wenshu)
        #死刑和无期是特殊情况
        if '判处死刑' in wenshu:
            element[1]=1
        if '无期徒刑' in wenshu:
            element[2]=1
        #添加这个元素
        final_list.append(element)

    data=pd.DataFrame(final_list,columns=['姓名','死刑','无期','有期','拘役','缓刑','罚金'])
    return data.sort_values(by='姓名')

def choose(text,string):
    result=dataF(text)[string]
    if len(result)==1:
        return result[0]
    else:
        result=','.join(result.astype(str))
    return result

if __name__ == "__main__":
    
    text="""		将罪犯樊冬林暂予监外执行。
	曲靖市马龙区人民法院
	二〇二四年一月二十七日"""

    print(countpeople(text))



主函数

import pandas as pd
import re
import slice
import os
from openpyxl import load_workbook

def chunlisheet(dat):
    dat['人数']=dat['裁判结果'].apply(slice.countpeople)
    new_columns=['姓名','死刑','无期','有期','拘役','缓刑','罚金']
    for column_name in new_columns:
        args=(column_name,)
        dat[column_name]= dat['裁判结果'].apply(slice.choose,args=args)
    dat['是否完整']=dat['裁判结果'].apply(slice.judge_wanzheng)
    return dat

def delete_dir(directory):
    file_list = os.listdir(directory)
    for file in file_list:
        file_path = os.path.join(directory, file)
        if os.path.isfile(file_path):
            os.remove(file_path)
    os.rmdir(directory)

#指定输出文件夹
output_dir='处理后'
#如果存在删除,再建立一个
if os.path.exists(output_dir):
    delete_dir(output_dir)
    os.makedirs(output_dir)
else:
    os.makedirs(output_dir)

# 指定数据文件夹路径
folder_path = './data'
# 使用 os.listdir 获取文件夹中的所有元素(文件和文件夹)
all_elements = os.listdir(folder_path)
# 过滤出文件名
file_names = [element for element in all_elements if os.path.isfile(os.path.join(folder_path, element))]

for file in file_names:
    input_excel_file_path = folder_path+'/'+file
    # 读取 Excel 文件中的所有 sheet
    all_sheets = pd.read_excel(input_excel_file_path, sheet_name=None)
    output_excel_file_path=output_dir+'/'+file[:-len('xls')]+'xlsx'
    # 创建 ExcelWriter 对象,设置 mode='w' 表示写入模式
    with pd.ExcelWriter(output_excel_file_path, engine='openpyxl', mode='w') as writer:
        #先建立一个空sheet
        pd.DataFrame().to_excel(writer, sheet_name='EmptySheet', index=False)
        # 遍历所有 sheet,并应用处理函数
        for sheet_name, df in all_sheets.items():
            #先将空的数据填充为“error”
            df_filled = df.fillna("error")
            processed_df = chunlisheet(df_filled)
            # 将处理后的 DataFrame 写入 ExcelWriter 对象的指定 sheet,并指定 sheet 名称
            processed_df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    #删除空sheet
    book = load_workbook(output_excel_file_path)
    book.remove(book['EmptySheet'])
    # 保存修改后的 Excel 文件
    book.save(output_excel_file_path)


效果

在这里插入图片描述

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值