刚学习 python ,想试试 excel 导入文本,就查询了资料,写了个脚本; 具体功能是实现将一个目录下的所有文本导入同一个 excel ,每个文本对应各自独立的 sheet 页。 我的操作环境是 Linux,但和 Windows 大体一致。
1. 需要用到的模块>>>import os
>>>import xlwt
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']
>>> 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)
输出的内容展示为:
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)
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 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 = data.replace('\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)
|