利用 Python 实现txt文本复杂数据处理与导出 Excel 文件

简介: 在实际工作中,我们经常需要处理从各种来源获取的文本数据,并将其转换为结构化数据以便进一步分析和使用。本文将介绍如何使用 Python 对文本数据进行处理,并将处理结果保存到 Excel 文件中。

1. 问题背景: 在数据处理的实践中,从原始文本数据中提取关键信息并将其转换为结构化数据是一个常见的任务。例如,在教育行业,我们可能需要处理包含院校、专业和招生计划等信息的文本数据,以便进行统计分析或制作报表。

2. 代码解析: 我们提供了一个示例代码,其中包含了一个名为 process() 的函数。该函数接受多个列表作为参数,循环遍历这些列表并将数据转换为字典格式,最终使用 Pandas 库将字典转换为 DataFrame。然后,将 DataFrame 中的数据写入到 Excel 文件中。

3. 函数介绍: process() 函数接受多个参数,包括学校编码列表、院校名称列表、总计划列表、专业编码列表、专业名称列表、专业计划列表和学费列表。该函数将这些数据组合成字典,并转换为 DataFrame 格式。

4. 数据处理过程: 在示例代码中,我们使用了一个循环来遍历各个列表,并将对应位置的数据组合成字典。这样可以保证每个学校或专业的数据都被正确地提取和处理。最终,我们将这些字典组成的列表转换为 DataFrame,并将其写入到 Excel 文件中。

5. 实例演示:

import re
import pandas as pd
# 打开文件
with open('./txt/combined.txt', 'r', encoding='utf-8') as file:
    # 逐行读取文件内容
    lines = file.readlines()

# 初始化一个空列表,用于存储满足条件的行
selected_lines = []
sch_bsnall = []
sch_nameall = []
sch_numbers = []
sch_bsn = ''
sch_name = ''
sch_num = ''

zy_bsn = []
zy_name = []
zy_num = []

fee_numbers = []
fee_num = ''

index_list = []
ind = 1
temp = 0
# 遍历每一行
for line in lines:
    parts = line.split()
    # 检查行是否以两个数字开头
    if parts[0].isdigit() and len(parts[0]) == 2:
        # 如果是,则将该行添加到列表中
        selected_lines.append(line.strip())
        # 使用正则表达式模式匹配类似 "5000 元" 格式的数据
        # pattern = r'\b\d+\s*元\b'
        pattern = r'\d\d\d\d+'
        # 使用 re.findall() 函数提取匹配到的数据
        matches = re.findall(pattern, line.strip())

        if len(sch_bsnall) - 1 >= 0:
            if sch_bsnall[len(sch_bsnall) - 1] == sch_bsn:
                index_list.append(ind)
            else:
                ind = ind + 1
                index_list.append(ind)
        else:
            index_list.append(ind)


        if len(matches) >= 1:
            temp = 1
            matchnum1 = matches[0].split()
            fee_num = matchnum1[0]

        fee_numbers.append(fee_num)
        sch_bsnall.append(sch_bsn)
        sch_nameall.append(sch_name)
        sch_numbers.append(sch_num)

        print(len(parts))
        zy_bsn.append(parts[0])
        if len(parts) >= 3:
            if parts[2].isdigit():
                zy_num.append(parts[2])
                zy_name.append(parts[1])
            else:
                # 获取列表中的第二个字符
                second_char = parts[1]
                # 初始化一个空字符串,用于存储提取出的数字
                extracted_digits = ''
                # 遍历第二个字符的每个字符
                for char in second_char:
                    # 判断字符是否为数字
                    if char.isdigit():
                        # 如果是数字,将其添加到提取的数字字符串中
                        extracted_digits += char
                zy_name.append(parts[1].replace(extracted_digits, ""))
                # 获取列表中的第三个字符
                three_char = parts[2]
                # 遍历第三个字符的每个字符
                for char in three_char:
                    # 判断字符是否为数字
                    if char.isdigit():
                        # 如果是数字,将其添加到提取的数字字符串中
                        extracted_digits += char
                zy_num.append(extracted_digits)
        else:
            # 获取列表中的第二个字符
            second_char = parts[1]
            # 初始化一个空字符串,用于存储提取出的数字
            extracted_digits = ''
            # 遍历第二个字符的每个字符
            for char in second_char:
                # 判断字符是否为数字
                if char.isdigit():
                    # 如果是数字,将其添加到提取的数字字符串中
                    extracted_digits += char
            if extracted_digits:
                parts1 = parts[1].split(extracted_digits)
                zy_name.append(parts1[0])
                zy_num.append(extracted_digits)
            else:
                zy_name.append(parts[1])
                zy_num.append('识别出错啦')
    elif parts[0].isdigit() and len(parts[0]) >= 4:
        sch_bsn = parts[0]
        if len(parts) >= 3:
            if parts[2].isdigit():
                sch_num = parts[2]
                sch_name = parts[1]
            else:
                # 获取列表中的第二个字符
                second_char = parts[1]
                # 初始化一个空字符串,用于存储提取出的数字
                extracted_digits = ''
                # 遍历第二个字符的每个字符
                for char in second_char:
                    # 判断字符是否为数字
                    if char.isdigit():
                        # 如果是数字,将其添加到提取的数字字符串中
                        extracted_digits += char
                sch_name = parts[1].replace(extracted_digits, "")
                # 获取列表中的第三个字符
                three_char = parts[2]
                # 遍历第三个字符的每个字符
                for char in three_char:
                    # 判断字符是否为数字
                    if char.isdigit():
                        # 如果是数字,将其添加到提取的数字字符串中
                        extracted_digits += char
                sch_num = extracted_digits
        else:
            # 获取列表中的第二个字符
            second_char = parts[1]
            # 初始化一个空字符串,用于存储提取出的数字
            extracted_digits = ''
            # 遍历第二个字符的每个字符
            for char in second_char:
                # 判断字符是否为数字
                if char.isdigit():
                    # 如果是数字,将其添加到提取的数字字符串中
                    extracted_digits += char
            if extracted_digits:
                parts1 = parts[1].split(extracted_digits)
                sch_name = parts1[0]
                sch_num = extracted_digits
            else:
                sch_name = parts[1]
                sch_num = '识别出错啦'
    else:
        # 使用正则表达式模式匹配类似 "5000 元" 格式的数据
        pattern = r'\b\d+\s*元\b'

        # 使用 re.findall() 函数提取匹配到的数据
        matches = re.findall(pattern, line.strip())
        if len(matches) >= 1:
            matchnum1 = matches[0].split()
            fee_num = matchnum1[0]
            temp = 0

newzy_num = []
for i in range(0, len(zy_num)):
    parts = zy_num[i].split(fee_numbers[i])
    newzy_num.append(parts[0])

def process(sch_bsnall,sch_nameall,sch_numbers,zy_bsn,zy_name,newzy_num,fee_numbers):
    lis = []
    for s in range(0, len(sch_bsnall)):
        dic = {}
        dic['校码'] = sch_bsnall[s]
        dic['院校名称'] = sch_nameall[s]
        dic['总计划'] = sch_numbers[s]
        dic['专码'] = zy_bsn[s]
        dic['专业名称'] = zy_name[s]
        dic['专计划'] = newzy_num[s]
        dic['学费(万)'] = fee_numbers[s]
        lis.append(dic)
    df = pd.DataFrame(lis)
    return df

# 写入到excel文件
res = process(sch_bsnall,sch_nameall,sch_numbers,zy_bsn,zy_name,newzy_num,fee_numbers)
res.index = index_list
res.to_excel(r'C:\Users\Administrator\Desktop\1\image\2.xlsx', index=True)

6. 实现效果:

生成的excel文件

7. 总结: 本文介绍了利用 Python 对文本数据进行处理,并将处理结果保存到 Excel 文件的方法。通过示例代码和详细解释,读者可以了解到如何使用 Python 和 Pandas 库来处理和导出数据,从而更加高效地应对实际工作中的数据处理需求。

  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python是一种功能强大、易于学习的高级编程语言,它拥有丰富的模块和库,能够满足各种数据处理的需求,其中包括将文本数据(txt)读取到Excel的操作。下面介绍一种简单的方法。 首先,需要使用Python中的pandas库来实现数据的读取和处理。pandas能够快速读取文本文件中的数据,并将其转换为DataFrame格式。 接下来,需要使用pandas中的to_excel()方法将已经转换好的数据保存为Excel文件。to_excel()方法可以设置文件名、Sheet名、数据格式等选项,使得导出的数据更加适合我们的需求。 下面是一个示例代码,来实现txt文件读取到Excel文件中: ```python import pandas as pd # 读取txt数据 data = pd.read_csv('data.txt', sep='\t') # 创建Excel写入器 writer = pd.ExcelWriter('data.xlsx') # 将数据写入Excel data.to_excel(writer, sheet_name='Sheet1', index=False) # 保存数据 writer.save() # 提示导出成功 print('数据已经成功导出Excel文件中。') ``` 在上面的代码中,首先使用pd.read_csv()方法读取txt文件,并使用”\t”作为分隔符,将数据转换为pandas中的DataFrame格式。然后,创建一个Excel写入器,并使用to_excel()方法将DataFrame中的数据写入到Excel中,其中sheet_name参数为Excel的sheet名,index=False表示不导出行索引信息。最后,保存Excel文件,并输出提示信息。 通过这种方法,我们可以快速方便地将txt数据读取到Excel中,并且可以通过修改代码中的参数,来适应不同的数据格式和导出需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值