博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
the day of python learning(文件)
阅读量:5108 次
发布时间:2019-06-13

本文共 3511 字,大约阅读时间需要 11 分钟。

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

我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来

1. 打开文件,得到文件句柄并赋值给一个变量

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

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

data=f.read()

3. 关闭文件

f.close()

关闭文件时,一种是关闭操作系统所打开的占内存的部分;另一种则是直接删除应用程序f文件

f.close()

del f  必须在close之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源。

也可以用with关键字来帮我们管理上下文

with open('a.txt','w') as f :

  pass

with open('a.txt','r') as read_f, open('b.txt','w') as write_f : 

  data = read_f.read()

  write_f.write(data)

文件的编码

以什么编码方式储存,就以什么方式打开

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码就是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

str------->>>byte encode 编码 r = '任阳城是帅哥' s = r.encode('gbk') encode编码 print(s)  byte------>>str decode 解码 t =s.decode('gbk') print(t)  英文字符解码编码都可以,因为占的字节都为一 s = 'abf' b = s.encode('utf-8') print(b)  byte --->str decode 解码 s1 = b.decode('gbk') print(s1)

文件的操作

a.txt     1,文件路径:d:\a.txt     2,编码方式:utf-8 gbk 。。。。     3,操作方式:只读,只写,追加,读写,写读.....         以什么编码方式储存的文件,就得以什么编码打开进行操作。  绝对路径与相对路径  只读:r(文件必须存在,不存在则会异样)  bytes ---->> str   f = open('test',mode='r',encoding='utf-8')   content = f.read()   print(content,type(content))   f.close()   f = open('test',mode = 'rb',)   content = f.read()   print(content)   f.close()  只写:w(不可读,存在则清空内容再写,不存在则创建)       wb  先将源文件的内容全部清除,再写   f = open('无',mode='w',encoding='utf-8')   f.write('如果没有这个文件则创建,写的编码方式为utf-8')   f.close()  wb   f = open('无',mode='wb')   f.write('以字节的形式写入'.encode("utf-8"))   f.close()   r+ 读写   r+b 读写(以bytes类型)追加读写   f = open('log',mode='r+',encoding='utf-8')   print(f.read())   f.write('洋葱是笨蛋')   f.close()   f = open('log',mode='r+b')   print(f.read())   f.write('加油努力'.encode('utf-8'))   f.close()  只能追加a,ab(不可读;不存在则创建,存在则只追加内容)
f = open(log',mode='a,encoding = 'utf-8')  f.write('我最帅')  f.close()  f = open('log',mode = 'a+b')  f.write('我最帅'.encode('utf-8'))  f.close()

总结:

带+可以读写,相当于多一个功能

r+读写,w+写读,a+写读

带b用于非字符文件的传输,保存。'b'表示将其以字节的形式存储,使用这种模式无需考虑文本文件的字符编码、图片文件的ipg格式、视频文件的avi格式

rb,wb,ab

 注意点:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

以bytes类型操作的可读可写追加模式

r+b,w+b,a+b

 

 

文件的操作方法

4.1常用操作方法。

read(3):

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

  2.文件打开方式为非文本模式(b),代表读取三个字节

其余的文件内光标移动都是以字节为单位的:

如seek,tell,truncate

注意点:

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

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

操作函数:

f.close()关闭文件

f.next()获取下一行数据,不存在则报错

f.read()读取指定字节数据

f.readline()仅仅读取一行数据

f.readlines()读取所有数据,并根据换行保存值列表

f.seek()指定文件中指针位置

f.tell()获取当前指针位置

f.truncate()截断数据,仅保留指定之前的数据

f.write()写数据

f.writelines()将一个字符串列表写入文件

f.xreadlines()可用于逐行读取文件,非全部

f.readable()判断是否可读

f.seekable()指针是否可操作

f.writable()是否可写

 

 

文件的修改

文件的数据是存放在硬盘上的,因而只存在覆盖,不存在修改一说。

文件是不可修改的,我们平时修改的只是系统模拟出来的效果

方式一:

将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕欧,再由内存覆盖到硬盘中(word,vim,nodpad++等编辑器)

import os 

with open('old') as read_file , open('new',mode = 'w') as write_file:

  data = read_f.read() #先全部读入内存,过大会造成系统卡死

  data = data.replace('原来的内容',’替换的内容‘)#在内存之后完成修改

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

os.remove('old')#移除原文件

os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果

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

import os 

with open('old') as read_file , open('new',mode = 'w') as write_file:

   for line in read_file:

    line = line.replace('原来的内容','替换的内容')

    write_f.write(line)   #这里调用for循环,一边替换一边进行写入

os.remove('old')#移除原文件

os.rename('new','old') #将新的文件取名为原文件名。达到模拟修改效果

转载于:https://www.cnblogs.com/wai-xin-ren/p/9495068.html

你可能感兴趣的文章
jvm参数
查看>>
我对前端MVC的理解
查看>>
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
对数器的使用
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
MySQL表的四种分区类型
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
StringBuffer是字符串缓冲区
查看>>
hihocoder1187 Divisors
查看>>
Azure 托管镜像和非托管镜像对比
查看>>