打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python 3读取多个文本写入同一个excel,每个文本对应各自独立的 sheet 页

刚学习 python ,想试试 excel 导入文本,就查询了资料,写了个脚本;
具体功能是实现将一个目录下的所有文本导入同一个 excel ,每个文本对应各自独立的 sheet 页。
我的操作环境是 Linux,但和 Windows 大体一致。

1. 需要用到的模块

>>>import os>>>import xlwt
  • os 模块提供了非常丰富的方法用来处理文件和目录,属于默认模块无需下载。

  • xlwt、xlrd 分别是对 excel 表格进行写和读的模块,但这两个模块不能处理 xlsx ;本例仅用到 xlwt 模块。

    如果需要处理 xlsx 文件,则需要用到 openpyxl 模块,而且 openpyxl 可以进行读和写的操作;只是处理时间上稍慢于 xlwt 和 xlrd。(但是随着硬件水平提高,时间将越来越小)

2. 遍历文件夹

首先需要遍历整个文件夹,读取所有文本。其中 filepath 和 xlspath 分别为文件夹路径,以及 xls 的文件路径。

def getline(filepath, xlspath):	# 读取所有文本    file_names = os.listdir(filepath)    # 对os.listdir进行排序 指定参数加上 (key=lambda x:int(x))    file_names.sort()    file_ob_list = []    try:        # 获取完整目录名并保存到数组        for file_name in file_names:            file_ob = filepath + "/" + file_name            file_ob_list.append(file_ob)        print(file_ob_list)	#测试输出所有的数组

2.1 读取文件并排序

这里需要用到 os.listdir(path) ,它的作用是返回path指定的文件夹包含的文件或文件夹的名字的列表。

    >>> import os    >>> file_names = os.listdir('.')    >>> print(file_names)    ['3.txt', '9.txt', '10.txt', '2.txt', '1.txt', '20.txt']
  • 但是我发现 os.listdir() 处理后是一个乱序数组,需要进行排序,如果需要指定特定符号排序,可以用 (key=lambda x:int(x)) ,详细可以百度一下。

	>>> file_names.sort()	>>> print(file_names)	['1.txt', '10.txt', '2.txt', '20.txt', '3.txt', '9.txt']	#倒着数第四位'.'为分界线,按照‘.’左边的数字从小到大排序	>>> file_names.sort(key=lambda x:int(x[:-4])) 	>>> print(file_names)	['1.txt', '2.txt', '3.txt', '9.txt', '10.txt', '20.txt']

2.2 获取文件完整目录等待处理

完整了路径就是目录加上 “/” 加上文件名。
如果你是 window ,目录分隔符是 “\”。

		for file_name in file_names:            file_ob = filepath + "/" + file_name	# 获取完整路径            # 存放到数组中            file_ob_list.append(file_ob)        print(file_ob_list)	#测试输出所有的数组

最后输入的内容是文本的绝对路径名:

$ python traversal_txt_xls.py['/root/txt_xls/1.txt', '/root/txt_xls/10.txt', '/root/txt_xls/2.txt', '/root/txt_xls/20.txt', '/root/txt_xls/3.txt', '/root/txt_xls/9.txt']

返回顶部

3. 将数据写入 excel 表格

做法是加入一个 for 循环, 遍历文件夹,并将每个 txt 循环写入到各自的 sheet 页。

3.1 新建表格,以及定义 sheet 名

对于 sheet 的名称,我用的是文本的文件名,当然也可以用正则过滤后缀或者其他名称命名。
需要用到 os.path.basename(),它会获取文件名,如果末尾为 ‘/’ ‘’ ,返回空。

		# 新建工作表格        xls = xlwt.Workbook()        # 循环读取文件,并写入到表格中        for file_ob in file_ob_list:            # 仅获取文件名,如果末尾为 '/' '\' ,返回空            sheet_name = os.path.basename(file_ob)

3.2 写入表格

  • 首先需要添加一个 sheet,名称为 前面的参数 sheet_name, 如果你要固定的名称,可以将参数写成 'sheet 1',这样就是固定名称。

    	# 每一个文本都会新建一个相同文件名的 sheet	sheet = xls.add_sheet(sheet_name, cell_overwrite_ok=True)

    注意:
    add_sheet 时, 置参数 cell_overwrite_ok=True , 可以覆盖原单元格中数据。
    cell_overwrite_ok 默认为 False , 覆盖的话, 会抛出异常.

  • 下面就是 txt 写入 xls,file_ob 代表 txt 文件,
    写入表格需要三个参数 ,横纵坐标,以及内容:x, i, data,默认坐标为 (0,0),

    			# txt 写入 xls			f = open(file_ob)            x = 0            # 按行读取文本            while True:                line = f.readline()
  • 如果没有数据,则退出循环。

                    if not line:                    break
  • 对于列的读取需要用到 制表符来换列。

                    for i in range(len(line.split('\t'))):                    data = line.split('\t')[i]                    sheet.write(x,i,data)   # x,i,data 代表横、纵坐标和内容                x += 1 #另起一行            # 然后读取下一个文本            f.close()        # 最后保存到文件         xls.save(xlspath)
    • 输出的内容展示为:

    • 每行的数据按 制表符 以及 line.split() 分隔:

3.3 去除多余的换行符(19/06/08更新)

  • 在处理文本时,excel会把 txt 中多余的换行符导入表格,先将写入内容转换为字符串,在替换换行符。
    上面的代码写入可以改成:

    while True:            line = f.readline()            if not line:                break            for i in range(len(line.split('\t'))):                data = line.split('\t')[i]                data = str(data)    #将数据转化为字符串,再对其中的换行符进行处理                data = data.replace('\n', ' ')  #使用python中字符串函数替换换行符为空格                sheet.write(x,i,data)   # x,i,data 代表横、纵坐标和内容            x += 1

返回顶部

4. 执行函数

首先需要定义参数,filepath 为文件目录,xlspath 为 xls文件的绝对路径。

		if __name__ == "__main__" :		    filepath = "/root/txt_xls"  #文件目录		    xlspath = "/root/txt_xls.xls"		    # 传入参数执行		    getline(filepath, xlspath)
  • if __name__ == "__main__" :的作用

    一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中 被调用(模块重用)执行。因此 if __name__ == "__main__" : 的作用就是控制这两种情况执行代码的过程,在if __name__ == "__main__" :下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。

  • 整个代码中还有一个 try...except 与 raise 的语句,它的用法是:

    try...except 语句;分析错误信息源头;
    logging记录错误;raise抛出错误
    详细看 https://www.jianshu.com/p/66e2e4104e7c

5. 最后

刚入门 python , 也在不断学习中,尝试着写写博客,可以帮着他人,也可以提高自己。

5.1 展示结果:

5.1 完整代码

#!/usr/bin/python3# -*- coding:utf-8 -*-################################################ Author        : SangUn# EMail         : SangUn.Yong@Gmail.com# Created Time  : # File Name     : traversal_txt_xls.py# Description   :###############################################'''当前代码实现一个文件夹内所有文本内容写入同一个 excel每个文本都有各自独立的 sheet 页文本单行用制表符分隔,代表多列数据'''# 导入模块import osimport xlwtdef getline(filepath, xlspath):    # 读取所有文本    file_names = os.listdir(filepath)    # 对os.listdir进行排序 指定参数加上 (key=lambda x:int(x[0]))    file_names.sort(key = lambda x:int(x[:-4]))    file_ob_list = []    try:        # 获取完整目录名并保存到数组        for file_name in file_names:            file_ob = filepath + "/" + file_name            file_ob_list.append(file_ob)        print(file_ob_list)        # 新建工作表格        xls = xlwt.Workbook()        # 循环读取文件,并写入到表格中        for file_ob in file_ob_list:            # 仅获取文件名,如果末尾为 '/' '\' ,返回空            sheet_name = os.path.basename(file_ob)            # 每一个文本都会新建一个相同文件名的 sheet            sheet = xls.add_sheet(sheet_name, cell_overwrite_ok=True)            # txt 写入 xls            f = open(file_ob)            x = 0            # 按行读取文本            while True:                line = f.readline()                if not line:                    break                for i in range(len(line.split('\t'))):                    data = line.split('\t')[i]                    data = str(data)    #将数据转化为字符串,再对其中的换行符进行处理                    data = data.replace('\n', ' ')  #使用python中字符串函数替换换行符为空格                    sheet.write(x,i,data)   # x,i,data 代表横、纵坐标和内容                x += 1            # 然后读取下一个文本            f.close()        xls.save(xlspath)    except:        raiseif __name__ == "__main__" :    filepath = "/root/txt_xls"  # 文件目录    xlspath = "/root/txt_xls.xls"	# xls 文件绝对路径    # 传入参数执行    getline(filepath, xlspath)  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
R语言读取文件夹下多个文件并进行合并数据生成总数据文件
如何将几百个单独的excel表汇总到一个excel表,并且在这个表内也是单独存在的?
Python 将数据写入文件(txt、csv、excel)
matlab读取excel文件及其数据处理
selenium实现excel文件数据的读、写
MATLAB读写Excel
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服