基本的文件操作

基本文件的操作

什么是文件

文件是操作系统为用户或应用程序体统的一个读写硬盘的虚拟单位,文件的操作是基于文件,即文件的操作核心是:读和写

也就是我们想要操作文件就是对操作系统发起请求,然后操作系统将用户或应用程序对文件的读写操作转换成集体的硬盘指令(比如说控制盘片转动,控制机械手臂移动,一次来读取数据)。

为什么要有文件?

内存无法保存数据,但凡我们想要永久保存数据都需要把文件保存到硬盘中,而操作文件就可以实现对硬件的操作。

如何用文件?

现在我们有一个需求需要把用户的账号密码存储到硬盘中,我们使用Python该如何操作。

从硬盘中读取数据

我们需要打开一个文件,需要向操作系统发起请求,要求操作系统打开文件,占用操作系统资源。Python中使用open()方法打开某个具体文件,open()方法内写入文件路径。

若给列表增加值,我们需要给列表赋值后才能给对应的列表增加值。文件如此

打开文件之后,文件不仅占用了内存,还对应了操作系统打开的文件,相当于使用文本编辑器打开了一个文件,并且我们操控文件只是为了读和写,因此打开文件并不是目的,读和写才是目的。

#read模式打开文件
f=open (r'user/mac/desktop/jupyter/pythoncourseware/32.txt',mode='r')
#读取文件内容,向操作系统发起 ==读==请求,会被操作系统转成具体的硬盘操作,降内容由硬盘读入内存
data=f.read()
print(data)
#由于Python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源
#del f只是回收变量f
f.close
从硬盘中写入数据
#write模式打开文件
f=open(r'/Users/mac/desktop/jupyter/pythoncourseware/32.txt',mode='w')
f.write("""name ='nick'
pwd='123'
""")
f.close()
f=open(f'/Users/mac/desktop/jupyter/pythoncourseware/32.txt',mode='r')
data=f.read()
print(data)
#name='nick'
#pwd='123'

总之打开文件分为三部曲

1、打开文件 2、读写 3、关闭


read   是一次性读取所以数据
 readline读取一行,如果读完了所有数据,继续读取为空
  f = open(r'C:\Users\nickc\Desktop\test.txt',encoding='gbk')  # 相当于你打开的文件
 	print(f.read())  # 一次性读取所有的内容
	print(1,f.read())
 	del f  # 只删除了变量名,但是文件对于操作系统来讲,还是打开状态的
    
fr = open(r'C:\Users\nickc\Desktop\test.txt',encoding='gbk')  # 相当于你打开的文件
 print(fr.read())  # 一次性读取所有的内容
 fr.close()  # 不仅删除了变量名f,并且也关闭了文件,这个时候文件对于操作系统来讲是关闭状态的

1. 打开文件的那一瞬间是在操作硬盘和内存
2. python3能操控硬盘和内存吗?一定不能,因为他是应用程序
3. 你看到的python3打开文件并操控,都是基于操作系统的
4. 然后你只是使用了del f,只是在删除f这个变量名的内存占用
5. 但是我们从来都没有告诉操作系统关闭文件
6. 所以我们必须使用f.close()关闭文件

绝对路径,相对路径(掌握)

1绝对路径 从根目录开始,一直到你需要的文件路径

  • windows系统绝对路径从盘符(C:\、D:\)开始写一个完整的路径

  • macos 系统从根目录(/Users)开始写一个完整的路径

    /Users/mac/Desktop/jupyter/pythonCourseware/img

2相对路径 从当前文件夹开始,到你需要的文件路径

相当于当前执行文件所在的文件夹开始找。

f=open('32.txt') # 32.txt与该.md文档同路径位置

o_绝对路径和相对路径-相对路径.jpg

文件的三种打开方式

***** 文件操作的基础模式有三种(默认的操作模式为r模式):

  • r模式为read
  • w模式为write
  • a模式为append

*****文件读写内容的格式有两种(默认的读写内容的模式为b模式):

  • t模式为text
  • b模式为bytes

==需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用

文件打开模式之r模式(掌握)

r:read,只读模式,只能读不能写,文件不存在时报错

f=open('32.txt',mode='r')    #报错
f.write()
f.close()

###rt:read by text
# windows的操作系统默认编码为gbk,因此需要使用utf8编码
f=open('32.txt',mode='rt',encoding='utf8')
data=f.read()
print(data)
print(f"type(data):{type(data)}")----------type(data):<class'star'>
f.close()
###rb:read by bytes
f=open('32.txt',mode='rb')
data=f.read
print(data)
print(f"type(data):{type(data)}")-----------type(data):<class'bytes'>
f.close()

f.read()读取文件指针会跑到文件的末端,如果再一次读取,读取的将是空格

f=open('32.txt',mode='rt',encoding='utf8')
data1=f.read()
data2=f.read()
print(f"data1:{data1}")
print(f"data2:{data2}")
f.close()
data1:aaa
    bbb
    ccc
data2:'空白'    
      

由于f.read()一次性读取文件的所有内容,如果文件非常大的话,可能会造成内存爆掉,即电脑卡死。因此可以使用f.readline()f.readlines()读取文件内容

#f.readline()/f.readlines()
f=open('32.txt',mode='rt',encoding='utf8')
print(f"f.readline():{f.readline()}")  ##判断文件是否可读
data1=f.readline()
data2=f.readlines()
print(f"data1:{data1}")
print(f"data2.{data2}")
f.close()
f.readline():true
data1:aaa
data2:['nick']

文件打开模式之w模式(掌握)

w:只能写,不能读,文件存在的时候会清空文件后再写入内容,文件不存在的时候会创建文件后写入内容。

#wt
f=open('34w.txt',mode='wt',encoding='utf8')
print(f"f.readable():{f.readable()}")
f.write('nick\n')   # \n是换行符
------
f.flush()       #立刻将文件内容从内存刷到硬盘
f.close
f.readable():false
# wb
f=open('34a.txt',mode='wb')
f.write('nick'.encode('unicode_escape'))     #编码成bytes类型
print(f"type('nick 帅的我五体投地'.encode('unicode_escape')): {type('nick 帅的我五体投地'.encode('unicode_escape'))}")
f.close()
type('nick 帅的我五体投地'.encode('unicode_escape')): <class 'bytes'>
3|0文件打开模式之a模式(掌握)')

文件打开模式之a模式(掌握)

a:可以追加。文件存在的话,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。

#at   append by type
f=open('34a.txt',mode='at',encoding='utf8')
print(f"f.readable():{f.readable()}")
f.readable():false

文件打开模式之b模式(掌握)

b模式是通用的模式,因为所有的文件在硬盘中都是以二进制的形式存储的,需要注意的是:b模式是读写文件,一定不能加上encoding参数,因为二进制无法再编码。``

try:
    import requests
    response = requests.get(
        'http://images.cnblogs.com/cnblogs_com/nickchen121/1447696/o_文件的三种打开模式-mv.jpg')
    data = response.content

    f = open('mv.jpg', 'wb')
    f.write(data)
    print('done...')
    f.close()
except Exception as e:
    print(e, '报错了,那就算了吧,以后爬虫处会详细介绍')
done...
f=open('34w.txt','wb')
f.write('nick 好帅啊'.encode('utf8'))
f.close()

with管理文件操作上下文(掌握)

之前我们使用open()方法操作文件,但是open打开文件后我们还需要手动释放文件对操作系统的占用。但是其实我们可以更方便的打开文件,即python提供的上下文管理工具——with open()。

with open ('32.txt','rt',encoding='utf8')as f :
    print(f.read())
# with open(文件路径,打开模式(rt/wt/at/rb/wb/ab),编码格式) as 变量名:
#变量名,read,write

with open()方法不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。

with open('32.txt','rb')as fr,\
		open('35r.txt','wb')as fw:
     f.write(f.read())

文件的高级应用

可读、可写(了解)
  • r+t 可读、可写
  • w+t 可写、可读
  • a+t 可追加、可读

r只读/w只写/a追加,可读可写(不推荐使用)r+,w+,a+

文件内指针移动(不要使用指针)

假设我们需要在文件内容中间的某一行增加内容,如果使用基础的r/w/a模式实现是非常困难的,因此我们需要对文件内的指针进行移动

指针

硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容

seek(offset,whence)

1.seek(offset,whence): offset代表文件指针的偏移量,单位是字节

#seek()
with open ('36r.txt','rt',encoding='utf8')as fr:
    print(f"fr.seek(4,0):{fr.seek(3,0)"})# # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾,但是1和2的移动只能在b模式下进行
    # fr.seek(0,2)  # 切换到文件末尾

2、tell():每次统计都是从文件开头 到 当前指针所在位置的

3、read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数

4、truncate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件

print(fa.tell())  # 告诉你光标当前的位置
print(fa.read(3))  # 光标后的字符个数,一个中文1个字符,3个字节;一个英文一个字符,一个字节
fa.truncate(3) # 如果它有参数,则光标会跳到指定字节数后,然后把后面的文件全部清空
posted @ 2019-05-28 17:52  enazede  阅读(207)  评论(0编辑  收藏  举报