【Python】06 - 常用文件处理(txt、excel [xlsx、xls])

目录

一、文件概述

二、文本文件操作

2.1 文件打开

2.2 文件的关闭

2.3 文件的读、写操作

1) 读取方法

2)写入方法

2.4 读写指针的重定位

2.5 其它文本文件

三、Excel文件处理

3.1 xlrd、xlwt、xlutils.copy

3.1.1 参考资料

3.1.2 xlrd模块 - 读操作

3.1.3 xlwt模块 - 写操作

3.2 pandas

3.3 xlwings、pandas

四、一二维数据的格式化和处理

五、word文档处理

六、应用实例


一、文件概述

--什么是文件?

  • 文件:指存储在外存介质(如磁盘、光盘、U盘等)上的数据集合
  • 文件名:通常由路径、主文件名、扩展名三部分组成       例如:D:\Python\test6-1.txt
import os

path = r'D:\Python\test6-1.txt'
print(os.path.dirname(path))  # 路径
print(os.path.basename(path))  # 主文件名.扩展名
print(os.path.split(path))  # 把路径分割成 dirname 和 basename,返回一个元组
print(os.path.splitext(path))  # 分割路径中的文件名(包含路径)与拓展名
print(os.path.splitext(os.path.basename(path)))  # 分割路径中的文件名(不含路径)与拓展名
# 分别获取文件名(不含路径)与拓展名

--文件分类

  • 根据文件的存储形式,可分为文本文件(即ASCII码)和二进制文件:
    • 文本文件:每一个字节存储1个字符,但一般占用存储空间较多
      • 可以使用 文本编辑软件 查看,如:txt文件、sql文件
      • 本质上还是二进制文件
    • 二进制文件:把内存中的数据,原样输出到磁盘文件中。
      • 文件的内容不能直接阅读,而是提供给其它软件使用的
      • 二进制文件不能使用 文本编辑软件 查看,需要使用特定的编辑器才能打开
      • 如图片、视频文件等
  • 二进制文件直接由0和1组成,没有统一字符编码,文件内部数据的组织格式与文件用途有关。
  • 二进制文件和文本文件最主要的区别在于是否有统一的字符编码
  • 通常,文本文件可以用“文本文件方式” 或“二进制文件方式” 打开,打开后的操作不同;二进制文件只能用“二进制文件方式” 打开

txt_file = open('6-1.txt', 'rt')  # rt 表示文本文件方式
print(txt_file.readline())
txt_file.close()

bin_file = open('6-1.txt', 'rb')  # rb 表示二进制文件方式
print(bin_file.readline())
bin_file.close()

运行结果:

二、文本文件操作

Python对文本文件和二进制文件采用统一的操作步骤: 打开 -- 读写 -- 关闭

2.1 文件打开

  • file_name :文件名,必填项
  • access_mode :访问模式
  • buffering 缓存:0 无缓存,1 缓存1行,大于1 缓存大小(字节)
  • 返回值:文件对象,可对文件进行各种操作

access_mode说明,打开文件的模式。默认值是’r’,表示使用文本的方式打开文件来读取

标识

含义

r

只读模式打开文件,默认

w

以只写模式打开文件,如果该文件已存在则先清空文件再写入。如果该文件不存在,创建新文件。

以添加模式打开文件,写文件的时候总是写到文件末尾,用seek也无用。打开的文件也是不能读的

r+

以读写方式打开文件,文件可读可写,可写到文件的任何位置

w+

以读写方式打开文件,和r+不同的是,它会truncate the file first

a+

以读写方式打开文件,和r+不同的是,它只能写到文件末尾

rb

以二进制只读模式打开

wb

以二进制只写模式打开,如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

ab

以二进制追加模式打开,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

rb+

以二进制读写模式打开

wb+

以二进制读写模式打开,如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

ab+

以二进制读写模式打开,如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

x创建写模式,文件不存在则创建,存在则返回异常 Fileexistserror

file对象

  • 属性
    • closed
    • mode
    • name
  • 方法
    • read( )
    • write( )
    • close( )
>>> f = open('E:\python\培训课件\p6-常用文件处理\code\myfile.txt','w+')
>>> f.write('Hello,Python!')
13
>>> f.read()
''
>>> f.seek(0)  # 从文件头开始,不偏移字符
0
>>> f.read()
'Hello,Python!'
>>> f.name
'E:\\python\\培训课件\\p6-常用文件处理\\code\\myfile.txt'
>>> f.mode
'w+'
>>> f.closed
False
>>> f.close()
>>> f.closed
True

seek()方法
作用:设置读写位置

f.seek(偏移量, whence=相对位置)
偏移量
大于0的数代表向文件末尾方向移动的字节数
小于0的数代表向文件头方向中移动的字节数
相对位置
0 代表从文件头开始偏移
1 代表从文件当前读写位置开始偏移
2 代表从文件尾开始偏移

  • seek(n,0):从起始位置开始移动n个字符
  • seek(n,1):从当前位置往后移动n个字符
  • seek(n,2):从文件结尾往前移动n个字符
f = open("myfile.txt", "r")
f.seek(5,1)             # 从文件头开始,偏移5个字符
data = f.read(5)        # 读取5个字符
print(data)             # 因此打印出来的就是5~9个字符
f.close()               # 关闭文件

2.2 文件的关闭

  • 当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的修改都被保存到文件中;
  • 请注意:即使写了关闭文件的代码,也无法保证文件一定能够正常关闭。例如,如果在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这时文件就无法正常关闭。在管理文件对象时推荐with关键字,可以有效地避免这个问题:

格式: with open(filename, mode, encoding) as fp:

s = 'Hello world\n文本文件的读取方法\n文本文件的写入方法\n'
with open('sample.txt', 'w') as fp:
    fp.write(s)

  • encoding:编码,默认为UTF-8

      处理文本文件时,由于编码问题报错的几率比较大

     常见的编码有:GB2312、GBK、UTF-8

2.3 文件的读、写操作

1) 读取方法

  • read([size=-1]):从文本文件中读取size个字符的内容作为结果返回,或从二进制文件中读取指定数量的字节并返回,如果省略size则表示读取所有内容

# abcdef
# ABCDEF
# 123456
# Python程序设计基础

>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-2.txt', 'r')
>>> f.read(1)
'a'
>>> f.read(1)
'b'
>>> f.read(10)
'cdef\nABCDE'
>>> f.read(10)
'F\n123456\nP'
>>> while True:
...     a = f.read()
...     if a:
...             print(a, end='')
...     else:
...             break
...
ython程序设计基础
>>> f.seek(0)
0
>>> f.read()  # 读取所有字符,不指定大小
'abcdef\nABCDEF\n123456\nPython程序设计基础'
>>> f.close()
  • readline():从文本文件中读取一行内容作为结果返回
  • readlines():把文本文件中的每行文本作为一个字符串存入列表中,返回该列表,对于大文件会占用较多内存,不建议使用
>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-2.txt', 'r')
>>> f.seek(0)
0
>>> f.readlines()
['abcdef\n', 'ABCDEF\n', '123456\n', 'Python程序设计基础']
>>> f.seek(0)
0
>>> f.readlines()
['abcdef\n', 'ABCDEF\n', '123456\n', 'Python程序设计基础']
>>> f.seek(0)
0
>>> for r in f.readlines():
...     print(r)  # 文本逐行打印
...
abcdef

ABCDEF

123456

Python程序设计基础
>>> f.seek(0)
0
>>> f.readline()
'abcdef\n'
>>> f.readline()
'ABCDEF\n'
>>> f.close()

文本文件逐行打印,即遍历文件的所有行可以直接这样写(把文件对象看作集合):

f = open(r'test6-2.txt', 'r')
for line in f:
    print(line)
f.close()

2)写入方法

  • write(s):把字符串s的内容写入文件
  • writelines(s):把字符串列表s写入文本文件,不添加换行符
>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-3.txt', 'w')
>>> f.write('str1')
4
>>> f.write('str2')
4
>>> f.write('python')
6
>>> alist = ['abcdef\n', 'ABCDEF\n', '123456\n', 'Python程序设计基础']
>>> f.writelines(alist)
>>> f.close()
>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-3.txt', 'r')
>>> f.read()
'str1str2pythonabcdef\nABCDEF\n123456\nPython程序设计基础'
>>> f.close()

2.4 读写指针的重定位

  • seek(offset[, whence]):把文件指针移动到新的位置,
    • offset表示相对于whence的位置。      
    • whence为0: 表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算。默认为0
  • tell():返回文件指针的当前位置
>>> f = open(r'E:\python\培训课件\p6-常用文件处理\code\test6-3.txt', 'r')
>>> f.read(2)
'st'
>>> f.tell()
2
>>> f.read(2)
'r1'
>>> f.tell()
4
>>> f.seek(20)
20
>>> f.read(5)
'\nABCD'
>>> f.tell()
26
>>> f.close()

2.5 其它文本文件

像以sql、pck、dsx、xml等为后缀的文本文件可以通过上面同样的方式来操作处理。

2.6 将文件格式从windows(CRLF)转为unix(LF)

参考:python_open函数中newline参数详解_我是个烧饼啊的博客-CSDN博客_newline=

# 设置newline参数为'\n'

file = r'E:\python\practice\转码\before.sql'
with open(file, "r", encoding='utf-8', newline=None) as f:
    contents = f.readlines()

save_file = r'E:\python\practice\转码\after.sql'
with open(save_file, "w", encoding='utf-8', newline='\n') as save:
    save.writelines(contents)

三、Excel文件处理

python处理excel文件主要有以下方式:

  • xlrd、xlwt、xluntils
  • pandas
  • xlwings
  • openpyxl模块......

样例数据:

参数1
说明:
1、os作业
2、sp作业
参数2
说明:
1、ds作业
2、ww作业
参数3
说明:
1、肯德基
2、哦大家
job参数数据源
c1s1dm
c2s2edw
c3s3ds
c4s4ods

下面详细介绍一下这几种用法

3.1 xlrd、xlwt、xlutils.copy

  • 应用场景:xls文件

3.1.1 参考资料

          基于xlrd、xlwt和openpyxl模块(xls文、xlsx文件)

          使用python的xlrd,xlwt和xlutils.copy保留样式

         Python中xlrd和xlwt模块使用方法(单元格样式)

          xls文件保持原格式保存

         python-批量修改Excel内的内容并保留原始格式

         xlrd模块用法的一些总结

3.1.2 xlrd模块 - 读操作

(1) 获取工作簿对象(workbook)

import xlrd

path = r'E:\python\培训课件\p6-常用文件处理\code\工作簿1.xls'
workbook = xlrd.open_workbook(path)


'''open_workbook参数'''
# open_workbook(filename=None, logfile=sys.stdout, verbosity=0, use_mmap=USE_MMAP, file_contents=None, encoding_override=None, formatting_info=False, on_demand=False, ragged_rows=False)
## filename=None  要打开的文件路径
## encoding_override=None  【】
## formatting_info=False  【为True时保留文件原格式】

(2) 获取工作表(sheet页签)

'''对workbook对象进行操作'''

## 获取所有sheet的名称
names = workbook.sheet_names()  # 返回一个list对象
print(names)

## 1)通过索引获取
worksheet = workbook.sheet_names()[0]  # 第1个页签
print(worksheet)

## 2)通过索引顺序获取
worksheet = workbook.sheet_by_index(0)  # 第1个页签
print(worksheet)

## 3)通过sheet名称获取
worksheet = workbook.sheet_by_name('第一个Sheet')  # 第1个页签
print(worksheet)

 (3)获取工作表的信息

'''对sheet对象进行操作'''
name = worksheet.name  #获取表的姓名
print(name)

nrows = worksheet.nrows  #获取该表总行数
print(nrows)

ncols = worksheet.ncols  #获取该表总列数
print(ncols)

(4)行和列的操作

"""
row_values(rowx=0, start_colx=0, end_colx=None)
-- rowx表示是获取第几行的数据
-- start_col表示从索引为多少开始,end_colx表示从索引为多少结束,
-- end_colx为None表示结束没有限制
"""
for n in range(nrows):  # 逐行读取数据
    print(worksheet.row_values(n))  # 获取指定行的数据并以列表的形式返回,列表的每一项为字符串类型

'''
col_values(colx=0, start_rowx=0, end_rowx=None)
'''
print(worksheet.col_values(0))  # 获取第一列数据


(5)获取指定单元格的数据

# 可以通过坐标读取表格中的数据
value1 = worksheet.cell_value(0, 3)
value2 = worksheet.cell_value(1, 0)
print(value1)  # job参数
print(value2)  # s1

value1 = worksheet.cell(0, 3).value
print(value1)  # job参数
value1 = worksheet.row(0)[3].value
print(value1)  # job参数

3.1.3 xlwt模块 - 写操作

xlwt官方文档

(1) 单元格格式

import xlwt
from datetime import datetime


# (1) 单元格格式
"""
easyxf(strg_to_parse="", num_format_str=None,
       field_sep=",", line_sep=";", intro_sep=":", esc_char="\\", debug=False)
"""

style0 = xlwt.easyxf('font: name Times New Roman, color-index red, bold on',
                     num_format_str='#,##0.00')
style1 = xlwt.easyxf(num_format_str='D-MMM-YY')


# (2) 新建工作簿
wb = xlwt.Workbook()
# 新建一个sheet页签
ws = wb.add_sheet('test_sheet1')


# (3) 写入单元格
ws.write(0, 0, 1234.56, style0)
ws.write(1, 0, datetime.now(), style1)
ws.write(2, 0, '3')  # A3
ws.write(2, 1, '4')  # B3
ws.write(2, 2, xlwt.Formula("A3+B3"))  # 公式 =A3+B3


# (4) 保存到xls文件
wb.save(r'E:\python\培训课件\p6-常用文件处理\code\result\xlwt.xls')

3.2 pandas(待更新)

3.3 xlwings、pandas

xlwings使用教程

sheet操作

import pandas as pd
import xlwings as xw

path = r'E:\python\培训课件\p6-常用文件处理\code\工作簿1.xls'
save_path = r'E:\python\培训课件\p6-常用文件处理\code\工作簿1_out.xls'

app = xw.App(visible=False, add_book=False)
app.display_alerts = False
app.screen_updating = False  # 是否实时刷新excel程序的显示内容
wb = app.books.open(path)
ws = wb.sheets[0]

# 按行填充值
# ws[1, 2].value = [1, 2]

# 按列填充值
# ws.range('C2').options(transpose = True).value = [1, 2, 3]

# 获取行数
df = pd.read_excel(path, header=0)
row_num = len(df)

para_list = []
for i in range(row_num):
    para_list.append(ws[i+1, 4].value)
ws[1, 2].options(transpose=True).value = para_list

# 表格填充,多维数组
# ws[1, 2].options(expand='table').value = [[1, 2], [3, 4]]

# 删除最后几列的内容和格式
rg = ws[0:, 3:]
last_col = rg.clear()

wb.save(save_path)
wb.close()
app.quit()

四、一二维数据的格式化和处理

4.1 数据组织的维度

  • 一维数据

        一维数据由对等关系的有序或无序数据构成,采用线性方式组织,对应于数学中的数组和集合等概念。

  • 二维数据

      也称表格数据,由关联关系数据构成,采用表格方式组织,对应于数学中的矩阵,常见的表格都属于二维数据。

    

  • 高维数据

        高维数据由键值对类型的数据构成,采用对象方式组织,属于整合度更好的数据组织方式。 高维数据在网络系统中十分常用,HTML、 XML、 JSON等都是高维数据组织的语法结构。

五、word文档处理

1、安装python-docx模块

2、将一个word文档另存到几个新的word文档中

from docx import Document

model_file = Document('python内容.docx')
with open(r'命名.txt') as f:
    con = f.read()
all_name = con.split('\n')
for name in all_name:
    model_file.save(name + '.docx')
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值