python课程总结day10

python

今日内容

文件操作

python">一、介绍

计算机系统分为:计算机硬件,操作系统,应用程序

我们要用python或其他语言编写的应用程序若想要永久保存下来,必须保存与硬盘中,这就涉及到应用程序要操作硬件。

应用程序是无法直接操作硬件的,这就用到了操作系统。

操作系统吧复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:

#1.打开文件,得到文件句柄并复制给一个变量

f=open(\'a.txt\',\'r\',\'encoding=utf-8\') #默认打开模式就为r

# f=open(\'a.txt\',\'r\')的过程分析

# 由应用程序向操作系统发起系统调用open(...)

# 操作系统打开该文件,并返回一个句柄给应用程序

# 操作程序将文件句柄赋值给变量f

#2.通过句柄对文件进行操作

data=f.read()

#3.关闭文件

f.close()

二、强调

打开一个文件包含两部分资源,操作系统打开的文件+应用程序的变量。

在操作完毕一个文件是,必须把该文件的这两部分资源不落地回收,

回收方法为:

1、f.close() #回收操作系统打开的文件

2、del f #回收应用程序级的变量

其中del f 一定要发生在f.close()之后,否则救护导致操作系统打开的文件还没有关闭,白白占用资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,早操作完毕文件后,一定要记住f.close()

f=open(...)室友操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认方式编码和明显是操作系统和说了算,操作系统会用自己的默认编码去打开文件,在Windows下是gbk,在Linux下是utf-8.

f=open(\'a.txt\',\'r\',\'encoding=utf-8 \')

文件处理

1、什么是文件

文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能

2、为何要用文件

读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作

应用程序-------------》文件对象、文件句柄

操作系统-------------》文件

硬件-----------------》硬盘

3、如何用文件

# f = open(r\'a.txt\', mode=\'rt\', encoding=\'utf-8\') #默认打开模式就为r

# # print(f) # 文件对象、文件句柄

# res = f.read()

# print(res)

#

# f.close()

# # print(f)

# # f.read()

# # del f

#

#

# with open(r\'a.txt\', mode=\'rt\', encoding=\'utf-8\') as f,\

# open(\'b.txt\',mode=\'wt\',encoding=\'utf-8\') as f1:

# pass

文件的打开模式

文件句柄 = open(\'文件路径\',\'模式\')

文件打开模式

1、控制文件读写操作的模式

r:只读模式(默认模式,文件必须存在,不存在则抛出异常)

w:只写模式(不可读,不存在则创建;存在则清空内容)

a:只追加写模式(不可读;不存在则创建;存在则只追加内容)

2、控制文件读写内容的模式

t(默认的):读写都是以字符串为单位的,只适用于文件文件,必须指定encoding参数

b:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数

# r模式:只读模式,如果文件不存在则报错,文件存在则文件指针处于文件开头

# f = open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')

# # print(f.read())

# # print(\'=\'*50)

# # print(f.read())

# print(f.readable())

# print(f.writable())

# f.close()

# w模式:只写模式,如果文件不存在则创建空文档,文件存在则清空,文件指针处于文件开头

# f = open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\')

# # f.write("你好\n")

# # f.write("哈哈哈\n")

# # f.write("我擦勒\n")

#

# f.write("你好\n哈哈哈\n我擦勒\n")

# # print(f.readable())

# # print(f.writable())

#

# f.close()

# 总结:w模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面

# a模式:只追加写模式,如果文件不存在则创建空文档,文件存在不会清空,文件指针处于文件末尾

# f = open(\'c.txt\',mode=\'at\',encoding=\'utf-8\')

# # f.write("4444\n")

# # f.write("555\n")

# # f.write("6666\n")

# print(f.readable())

# print(f.writable())

# f.close()

# 总结:a模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面,这一点与w模式相同

# 不同的是,在打开了文件关闭然后重新打开的情况下,a模式永远写在后面

# b模式:读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数

# with open(\'1.mp4\',mode=\'rb\') as f:

# res = f.read()

# print(res.decode(\'utf-8\'))

# with open(\'a.txt\',mode=\'rb\') as f:

# res = f.read()

# print(res.decode(\'utf-8\'))

# with open(\'a.txt\',mode=\'ab\') as f:

# f.write("啊手动阀手动阀".encode(\'utf-8\'))

# 例:文件拷贝功能

# # 方案一:

# with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\1111111.mp4\',mode=\'wb\') as f2:

# res = f1.read()

# f2.write(res)

# 方案二:

# 储备知识:

# with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:

# # f.read()

# for line in f:

# print(line,end=\'\')

# with open(\'1.mp4\',mode=\'rb\') as f:

# for line in f:

# print(line)

# 具体实现:

# with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\1111111.mp4\',mode=\'wb\') as f2:

# for line in f1:

# f2.write(line)

# 可读可写

# r+t

# w+t

# a+t

#

# r+b

# w+b

# a+b

# with open(\'a.txt\',mode=\'r+t\',encoding=\'utf-8\') as f:

# print(f.readable())

# print(f.writable())

# print(f.read())

# f.write("22222222222222222222\n")

# with open(\'a.txt\',mode=\'w+t\',encoding=\'utf-8\') as f:

# print(f.readable())

# print(f.writable())

文件操作的其他方法

f.read()  #读取所有内容,光标移动到文件末尾

f.raedline() #读取到一行内容,光标移动到第二行首部

f.readlines() #读取每一行内容,存放于列表中

f.write(\'1111\n222\n\') #针对文本模式的写,需要自己写换行符

f.write(\'1111\n222\n\'.encode(\'utf-8\')) #针对b模式的写,需要自己写换行符

f.writelines([\'333\n\',\'444\n\']) #文件模式

f.writelines([bytes(\'333\n\',encoding=\'utf-8\'),\'444\n\'.encode(\'utf-8\')]) #b模式

f.readable() #文件是否可读

f.writeable() #文件是否可读

f.closed() #文件是否关闭

f.encoding() #如果文件打开模式为b,则没有该属性

f.flush() #立刻将文件内容从内存刷到硬盘

f.name

# with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:

# # lines = f.readlines()

# # print(lines)

#

# print(f.readline())

# print(f.readline())

# with open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\') as f:

# # f.write("111\n222\n333\n")

#

# # lines = [\'111\n\',\'222\n\',\'3333\n\']

# # for line in lines:

# # f.write(line)

#

# # f.writelines(lines)

#

# f.write(\'hello\')

# f.flush()

# # f.writelines(\'hello\')

#

控制文件按指针移动

一、read(3)

1.文件打开方式为文本模式是,代表读取3个字符

2.文件打开方式为b模式时,代表读取3个字符

二、其余的文件内光标移动都是以字节为单位,如seek,tell,truncate

注意:

1.seek有3种移动方式0,1,2,其中1和2必须在b模式下进行,但无论那种模式,都是以bytes为单位移动的

2.truncate是截断文件,所以文件的打开方式必须可写,但不能用w或者w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a+等模式下测试效果

# 大前提:只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes

# # f.read()

# # with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:

# # res = f.read(6)

# # print(res)

#

# # with open(\'a.txt\',mode=\'rb\') as f:

# # # res = f.read(6)

# # res = f.read(8)

# # print(res.decode(\'utf-8\'))

#

# # f.truncate()

# # with open(\'a.txt\',mode=\'r+t\',encoding=\'utf-8\') as f:

# # f.truncate(8)

#

#

# # f.seek移动的全都是字节个数

# # f.seek(字节个数,0)

# # f.seek(字节个数,1)

# # f.seek(字节个数,2)

文件的修改(补充小知识)

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim...)

# import os

#

# with open(\'a.txt\') as read_f,open(\'.a.txt.swap\',\'w\') as write_f:

# data=read_f.read() #全部读入内存,如果文件很大,会很卡

# data=data.replace(\'alex\',\'SB\') #在内存中完成修改

#

# write_f.write(data) #一次性写入新文件

#

# os.remove(\'a.txt\')

# os.rename(\'.a.txt.swap\',\'a.txt\')

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os

with open(\'a.txt\') as read_f,open(\'.a.txt.swap\',\'w\') as write_f:

for line in read_f:

line=line.replace(\'alex\',\'SB\')

write_f.write(line)

os.remove(\'a.txt\')

os.remove(\'.a.txt.swap\',\'a,txt\')

以上是 python课程总结day10 的全部内容, 来源链接: utcz.com/z/388534.html

回到顶部