当前位置:   article > 正文

pytho项目9 读写文件内容_(2)已知有文件“超市营业额.xlsx”中记录了某超市2019年3月1日至3日各个员工在不

(2)已知有文件“超市营业额.xlsx”中记录了某超市2019年3月1日至3日各个员工在不

项目9 读写文件内容

1

9.1  了解文件的概念及分类

 为了长期保存数据以便重复使用、修改和共享,必须将数据以文件的形式存 储到外部存储介质(如磁盘、U盘、光盘或云盘、网盘、快盘等)中。

 文件操作在各类应用软件的开发中均占有重要的地位:

 管理信息系统是使用数据库来存储数据的,而数据库最终还是要以文件的形式存储到 硬盘或其它存储介质上。

 应用程序的配置信息往往也是使用文件来存储的,图形、图像、音频、视频、可执行 文件等等也都是以文件的形式存储在磁盘上的。

2

9.1  了解文件的概念及分类

按文件中数据的组织形式把文件分为文本文件和二进制文件两类。

 文本文件:文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符'\n' 尾。常规字符串是指记事本或其他文本编辑器能正常显示、编辑并且人类能够直接阅读和

理解的字符串,如英文字母、汉字、数字字符串。文本文件可以使用字处理软件如gedit、记事本进行编辑。

 二进制文件:二进制文件把对象内容以字节串(bytes)进行存储,无法用记事本或其他普通 字处理软件直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行

解码后读取、显示、修改或执行。常见的如图形图像文件、音视频文件、可执行文件、资

源文件、各种数据库文件、各类office文档等都属于二进制文件。

3

9.2  了解文件操作基本知识

 无论是文本文件还是二进制文件,其操作流程基本都是一致的,首先打开 件并创建文件对象,然后通过该文件对象对文件内容进行读取、写入、删除、

修改等操作,最后关闭并保存文件内容。

4

9.2.1  内置函数open()

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

 file参数指定了被打开的文件名称。

mode参数指定了打开文件后的处理方式。

buffering参数指定了读写文件的缓存模式。0表示不缓存,1表示缓存,如大于1则表示缓冲区的

大小。默认值是缓存模式。

encoding参数指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的 任何格式,如GBKutf8CP936等等。

5

9.2.1  内置函数open()

 文件打开模式

模式

说明

r

读模式(默认模式,可省略),如果文件不存在则抛出异常

w

写模式,如果文件已存在,先清空原有内容

x

写模式,创建新文件,如果文件已存在则抛出异常

a

追加模式,不覆盖文件中原有内容

b

二进制模式(可与其他模式组合使用)

t

文本模式(默认模式,可省略)

+

读、写模式(可与其他模式组合使用)

6

9.2.1  内置函数open()

 如果执行正常,open()函数返回1个文件对象,通过该文件对象可以对文件 进行读写操作如果指定文件不存在访问权限不够磁盘空间不或其他 原因导致创建文件对象失败则抛出异常。

f1 = open(‘D:\金山办公项目班\gt.txt’)  #文件不存在抛出异常

f1 = open( 'file1.txt', 'r' )     # 以读模式打开文件

f2 = open( 'file2.txt', 'w')      # 以写模式打开文件

 当对文件内容操作完以后,一定要关闭文件对象,这样才能保证所做的任何 修改都确实被保存到文件中。

f1.close()

7

9.2.2  文件对象属性与常用方法

方法

功能说明

close()

把缓冲区的内容写入文件,同时关闭文件,并释放文件对象

read([size])

从文本文件中读取size个字符(Python 3.x)的内容作为结果返回,或从二 进制文件中读取指定数量的字节并返回,如果省略size则表示读取所有内容

readline()

文本文件中读取一行内容作为结果返回

readlines()

文本文件中的每行文本作为一个字符串存入列表中,返回该列表

seek(offset[, whence])

 把文件指针移动到新的字节位置,offset表示相对于whence的位置。whence 为0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始 计算,默认为0

tell()

返回文件指针的当前位置

write(s)

把s的内容写入文件

writelines(s)

把字符串列表写入文本文件,不添加换行符

8

9.2.3  上下文管理语句with

 在实际开发中,读写文件应优先考虑使用上下文管理语句with,关键字with 可以自动管理资源,不论因为什么原因(哪怕是代码引发了异常)跳出with

块,总能保证文件被正确关闭,并且可以在代码块执行完毕后自动还原进入

该代码块时的上下文,常用于文件操作数据库连接网络连接多线程与 多进程同步时的锁对象管理等场合。

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

#这里写通过文件对象fp读写文件内容的语句

9

9.3  文本文件内容操作

 例9-1 向文本文件中写入内容,然后再读出。

s = 'Hello world\n文本文件的读取方法\n文本文件的写入方法\n'

with open(r'C:\Users\HUAWEI\Desktop\sample.txt', 'wt')as fp:#默认使用cp936编码

fp.write(s)

with open(r'C:\Users\HUAWEI\Desktop\sample.txt', 'rt') as fp:#默认使用cp936编码

print(fp.read())

10

9.3  文本文件内容操作

 例9-2 遍历并输出文本文件的所有行内容。

with open(r‘C:\Users\HUAWEI\Desktop\sample.txt’, ‘rt’) as fp: #读出一行 print(fp.readline())
fp.close()

#读出所有行-遍历
with open(r'C:\Users\HUAWEI\Desktop\sample.txt', 'rt') as fp: for line in fp:                 #文件对象可以直接迭代 print(line)
#读出所有行
with open(r'C:\Users\HUAWEI\Desktop\sample.txt', 'rt') as fp: print(fp.readlines())

11

9.3  文本文件内容操作案例精选

 例9-3 假设文件data.txt中有若干整数,每行一个整数,编写程序读取所有整数,将其按降序排序后再 写入文本文件data_asc.txt中。

n = '2\n4\n43\n5\n0\n49\n23\n12'
with open(r'C:\Users\HUAWEI\Desktop\data.txt', ‘xt') as fp1:  #创建data.txt文件 fp1.write(n)
fp1.close()

with open(r’C:\Users\HUAWEI\Desktop\data.txt’, ‘rt’) as fp1: #查看文件data.txt print(fp1.readlines())
fp1.close()

12

9.3  文本文件内容操作案例精选

 例9-3 假设文件data.txt中有若干整数,每行一个整数,编写程序读取所有整数,将其按降序排序后再 写入文本文件data_asc.txt中。

with open(r'C:\Users\HUAWEI\Desktop\data.txt', 'r') as fp:
data = fp.readlines()                     #读取所有行,存入列表
data = [int(item) for item in data]           #列表推导式,转换为数字
data.sort(reverse=True)                       #降序排序
data = [str(item)+'\n' for item in data]      #将结果转换为字符串
# data.sort(key=int,reverse=True)             #直接这样更简洁
with open(r'C:\Users\HUAWEI\Desktop\data_desc.txt', 'xt') as fp:        #将结果写入文件

fp.writelines(data)

with open(r'C:\Users\HUAWEI\Desktop\data_desc.txt', 'rt') as fp:        #将结果写入文件 print(fp.readlines())

fp.close()
13

9.3  文本文件内容操作

 例9-4 统计文本文件中最长行的长度和该行的内容。

with open(r'C:\Users\HUAWEI\Desktop\sample.txt') as fp: result = [0, '']
for line in fp:
t = len(line)
if t > result[0]:
result = [t, line]
print(result)

14

9.4 ExcelWord文件操作

 例9-5 统计docx文档段落、表格、图片、字符、空格的数量。

 Pip install python-docx     #安装扩展库

 Document类,创建Word文档的对象obj(表示整个文档)

 Document 对象包含一个 Paragrapha 对象的列表,Paragraph 对象包含一个 Run 对象的列表。

 obj.inline_shapes包含所有内嵌类型(主要是图片)

 Run 对象标识相同样式的文本。

 obj.paragraphs包含所有段落

 obj.tables包含所有表格

15

9.4 ExcelWord文件操作

from docx import Document

fn = input('请输入docx文件名:')
obj = Document(fn)
#obj = Document(r'C:\Users\HUAWEI\Desktop\花儿汇.docx')
num_paragraphs = 0
num_pictures = 0
num_tables = 0
num_characters = 0
num_spaces = 0

for p in obj.paragraphs:
#遍历所有段落,统计段落数量、字符数量和空格数量 num_paragraphs += 1
num_characters += len(p.text)
num_spaces += p.text.count(' ')
for t in obj.tables:
#遍历所有表格中的所有单元格
num_tables += 1
for r in t.rows:
for c in r.cells:
num_characters += len(c.text) num_spaces += c.text.count(' ')

请输入docx文件名:C:\Users\HUAWEI\Desktop\花儿汇.docx 段落数:40
图片数:0
表格数:0
字符数:1
空格数:0

#统计图片数量
num_pictures = sum(map(lambda shape: shape.type==3, obj.inline_shapes))
msg = '''段落数:{}\n图片数:{}\n表格数:{}\n字符数:{}\n空格数:{}'''.format(num_paragraphs, num_pictures, num_tables, num_characters, num_spaces)
print(msg)

 例9-5 统计docx文档段落、表格、图片、字符、空格的数量。

16

9.4 ExcelWord文件操作

 例9-6 简体中文Word文档转为繁体版。

from langconv import Converter
from docx import Document

def convert(text, flag=0):
'''text:要转换的文本,flag=0表示简转繁,flag=1表示繁转简''' rule = 'zh-hans' if flag else 'zh-hant'
return Converter(rule).convert(text)

obj = Document(r'C:\Users\HUAWEI\Desktop\花儿汇.docx')

for p in obj.paragraphs:
p.text = convert(p.text)

for t in obj.tables:
for r in t.rows:
for c in r.cells:
c.text = convert(c.text)

obj.save(r'C:\Users\HUAWEI\Desktop\花儿汇繁体.docx')

17

9.4 ExcelWord文件操作

 例9-7 编写程序,修改Word文档中部分文字的颜色。

from docx import Document
from docx.shared import RGBColor
n=0
obj = Document(r'C:\Users\HUAWEI\Desktop\花儿 汇.docx')
word = '粮票'

def set_run(run):
# 设置run的字体大小、是否加粗以及字体颜色 run.font.size = font_size
run.bold = bold
run.font.color.rgb = color

for p in obj.paragraphs:
n=n+1
print(n)
for r in p.runs:
print(r.text)
if word not in r.text:
pass
# 获取当前run的字体属性
font_size = r.font.size
bold = r.bold
color = r.font.color.rgb
# 使用关键词切分当前run的文本
rest = r.text.split(word)
#print(rest)
# 清除当前run的内容
r.text = ''
for text in rest[:-1]:
run = p.add_run(text=text)
set_run(run)
run = p.add_run(word)
run.font.size = font_size
run.bold = bold
run.font.color.rgb = RGBColor(255,0,0) run = p.add_run(rest[-1])
set_run(run)
obj.save(r'C:\Users\HUAWEI\Desktop\花儿汇hou.docx')

18

9.4 ExcelWord文件操作

 例9-8 已知某Excel文件中存储了几个人的爱好,要求编写程序,操作该文件,追加一列,按行对每个人 的爱好进行汇总。如图9-1所示,最后一列为处理后追加的内容。

pip install openpyxl
Excel:Workboot:Worksheet:row:cell

19

9.4 ExcelWord文件操作

from openpyxl import load_workbook

wb = load_workbook(r'C:\Users\HUAWEI\Desktop\每个人的爱好.xlsx')
ws = wb.worksheets[0]
for index, row in enumerate(ws.rows):
if index == 0:
titles = tuple(map(lambda cell: cell.value, row))[1:]
print(titles)
lastCol = len(titles)+2
ws.cell(row=index+1, column=lastCol, value='所有爱好')
else:
values  = tuple(map(lambda cell: cell.value, row))[1:]
result = ''.join((titles[i] for i, v in enumerate(values) if v=='')) ws.cell(row=index+1, column=lastCol, value=result)

wb.save(r'C:\Users\HUAWEI\Desktop\每个人的爱好汇总.xlsx')

20

9.4 ExcelWord文件操作

 例9-9 编写程序,在当前文件夹中查找包含特定字符串的所有docxxlsx pptx文件。

pip install openpyxl
pip install python-docx
pip install python-pptx

from sys import argv
from os import listdir
from os.path import join, isfile, isdir
from docx import Document
from openpyxl import load_workbook
from pptx import Presentation

21

9.4 ExcelWord文件操作

def checkdocx(dstStr, fn):
# 打开docx文档
document = Document(fn)
# 遍历所有段落文本
for p in document.paragraphs:
if dstStr in p.text:
return True
# 遍历所有表格中的单元格文本
for table in document.tables:
for row in table.rows:
for cell in row.cells:
if dstStr in cell.text: return True
return False

22

9.4 ExcelWord文件操作

def checkxlsx(dstStr, fn):
# 打开xlsx文件
wb = load_workbook(fn)
# 遍历所有工作表的单元格
for ws in wb.worksheets:
for row in ws.rows:
for cell in row:
try:
if dstStr in cell.value: return True
except:
pass
return False

23

9.4 ExcelWord文件操作

def checkpptx(dstStr, fn):
# 打开pptx文档
presentation = Presentation(fn)
# 遍历所有幻灯片
for slide in presentation.slides:
for shape in slide.shapes:
# 表格中的单元格文本
if shape.shape_type == 19:
for row in shape.table.rows:
for cell in row.cells:
if dstStr in cell.text_frame.text:

# 文本框

return True

elif shape.shape_type == 14:
try:
if dstStr in shape.text:

return True

except:

24

pass

9.4 ExcelWord文件操作

def main(dstStr, flag):
# 一个圆点表示当前文件夹
dirs = ['.']
while dirs:
# 获取第一个尚未遍历的文件夹名称
currentDir = dirs.pop(0)
for fn in listdir(currentDir):
path = join(currentDir, fn)
if isfile(path):
if path.endswith('.docx') and checkdocx(dstStr, path): print(path)
elif path.endswith('.xlsx') and checkxlsx(dstStr, path): print(path)
elif path.endswith('.pptx') and checkpptx(dstStr, path): print(path)
# 广度优先遍历目录树
elif flag and isdir(path):
dirs.append(path)

25

9.4 ExcelWord文件操作

# argv[0]为程序文件名
# argv[1]表示是否要检查所有子文件夹中的文件
if argv[1] != '/s':
dstStr = argv[1]
flag = False
else:
dstStr = argv[2]
flag = True

main(dstStr, flag)

26

9.4 ExcelWord文件操作

 例9-10 已知文件超市营业额.xlsx”中记录了某超市201931日至5日各员 工在不同时段、不同柜台的销售额。部分数据如图9-2所示,要求编写程序,读取该文件中的数据,并统计每个员工的销售总额、每个时段的销售总额、每个柜台的销售总额。

27

9.4 ExcelWord文件操作

from openpyxl import load_workbook

# 3个字典分别存储按员工、按时段、按柜台的销售总额

persons = dict()

periods = dict()

goods = dict()
ws = load_workbook('超市营业额.xlsx').worksheets[0]

for index, row in enumerate(ws.rows):
# 跳过第一行的表头

if index==0:

continue
# 获取每行的相关信息

_, name, _, time, num, good = map(lambda cell: cell.value, row) # 根据每行的值更新三个字典

persons[name] = persons.get(name, 0)+num

periods[time] = periods.get(time, 0)+num

goods[good] = goods.get(good, 0)+num

print(persons)

print(periods)

print(goods)

29

36

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/640765
推荐阅读
相关标签
  

闽ICP备14008679号