python3读取多个⽂本写⼊同⼀个excel,每个⽂本对应各⾃独⽴的sheet页⽂章⽬录
1. 需要⽤到的模块
2. 遍历⽂件夹
2.1 读取⽂件并排序
2.2 获取⽂件完整⽬录等待处理
3. 将数据写⼊ excel 表格
3.1 新建表格,以及定义 sheet 名
3.2 写⼊表格
3.3 去除多余的换⾏符(19/06/08更新)
4. 执⾏函数
5. 最后
5.1 展⽰结果:
5.1 完整代码
刚学习 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_', '/root/txt_', '/root/txt_', '/root/txt_', '/root/txt_', '/root/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',这样就是固定名称。
python怎么读取xls文件# 每⼀个⽂本都会新建⼀个相同⽂件名的 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 = place('\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到其他脚本中是不会被执⾏的。
整个代码中还有⼀个pt 与 raise的语句,它的⽤法是:
logging记录错误;raise抛出错误
详细看www.jianshu/p/66e2e4104e7c。
5. 最后
刚⼊门 python ,也在不断学习中,尝试着写写博客,可以帮着他⼈,也可以提⾼⾃⼰。
5.1 展⽰结果:
5.1 完整代码
#!/usr/bin/python3
# -*- coding:utf-8 -*-
>>>>>>>>>##
# Author : SangUn
# EMail : SangUn.Yong@Gmail
# Created Time :
# File Name : traversal_txt_xls.py
# Description :
>>>>>>>>>##
'''
当前代码实现⼀个⽂件夹内所有⽂本内容写⼊同⼀个 excel
每个⽂本都有各⾃独⽴的 sheet 页
⽂本单⾏⽤制表符分隔,代表多列数据
'''
# 导⼊模块
import os
import xlwt
def 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 = place('\n', ' ') #使⽤python中字符串函数替换换⾏符为空格 sheet.write(x,i,data) # x,i,data 代表横、纵坐标和内容
x += 1
# 然后读取下⼀个⽂本
f.close()
xls.save(xlspath)
except:
raise
if __name__ == "__main__" :
filepath = "/root/txt_xls" # ⽂件⽬录
xlspath = "/root/txt_xls.xls" # xls ⽂件绝对路径
# 传⼊参数执⾏
getline(filepath, xlspath)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论