文件处理
Posted 浩元
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件处理相关的知识,希望对你有一定的参考价值。
一、文件操作
一、文件操作
1、介绍
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
2、在Python中
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
3、“f=open(‘a.txt‘,mode=‘r‘,encoding=‘utf-8‘)“的流程分析
打开文件流程分析
1)、应用程序--->操作系统发起系统调用
2)、操作系统打开文件,返回一个文件句柄给应用程序
3)、在应用程序中把文件句柄赋值给变量
注意:
1、打开一个文件对应两部分,一个是python级别的文件句柄,一个是操作系统打开的文件(默认打开文件的编码是以操作系统的编码为准的),除非指定encoding指定文件编码
2、当文件操作完毕后,应回收两部分资源;
4、Python上下文管理
del f:回收应用程序资源(python解释器自带的清理垃圾机制)
f.close():回收操作系统
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()。
f=open(‘a.txt‘,mode=‘r‘,encoding=‘utf-8‘) data=f.read() # f.close() with open(‘a.txt‘,mode=‘r‘,encoding=‘utf-8‘) as f: print(f.read())
5、Python2中的file与open
1) 首先在python3中操作文件只有一种选择,那就是open()
2) 而在python2中则有两种方式:file()与open()
两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,我们一般使用open()打开文件进行操作,而用file当做一个类型,比如type(f) is file。
一、文件模式
文件句柄 = open(‘文件路径’,‘模式’)
文件模式:
Character | Meaning |
‘r‘ | open for reading (default) |
‘w‘ | open for writing, truncating the file first |
‘a‘ | open for writing, appending to the end of the file if it exists |
‘b‘ | binary mode |
‘t‘ | text mode (default) |
‘+‘ | open a disk file for updating (reading and writing) |
‘U‘ | universal newline mode (for backwards compatibility; should not be used in new code) |
1、打开文件的模式(默认文本模式)
r:默认打开模式,只读,文件不存在则报错
# f=open(‘a.txt‘,mode=‘r‘,encoding=‘utf-8‘)
# print(‘====>‘,f.read())#读所有
# print(f.readline()) #读一行
# print(f.readline()) #读两行,一次读一行
# print(f.readline(),end=‘‘)#一次读一行
# print(f.readlines())#读所有,结果返回列表中
# f.close
w:写模式,如果文件存在则清空,如果文件不存在,则新建
f=open(‘a.txt‘,mode=‘w‘,encoding=‘utf-8‘)
f.write(‘1111\n‘)
f.write(‘2222\n‘
l=[‘444\n‘,‘555\n‘,‘666\n‘]
for line in line
f.write(line)
f.writeline()#一次读一行
f.writelines([‘444\n‘,‘555\n‘,‘666\n‘])#读全部,放入列表
f.close()
a:追加写模式,如果文件存在则把光标移动到文件末尾,如果文件不存在则新建
# f=open(‘c.txt‘,‘a‘,encoding=‘utf-8‘)
# f.write(‘222\n‘)
# f.write(‘222\n‘)
# f.writelines([‘555\n‘,‘666\n‘])
b:以bytes的形式去操作问件内容,不能指定编码 rn--->wb cp 不需要考虑格式
with open(‘readline.jpg‘,‘rb‘) as f:
print(f.read()) with open(‘c.txt‘, ‘rb‘) as f: data=f.read() print(data.decode(‘utf-8‘))
with open(‘d.txt‘, ‘wb‘) as f:
data=f.write(‘hello‘.encode(‘utf-8‘))
print(data)
with open(‘d.txt‘, ‘ab‘) as f:
data = f.write(‘hello\n‘.encode(‘utf-8‘))
print(data)
了解部分:
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】
x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】
xb
2、文件的特殊操作
#以文本的模式读文件,n代表的字符的个数,较为特殊为字符
# with open(‘a.txt‘, ‘r‘,encoding=‘utf-8‘) as f:
# data=f.read(3)
# print(data)
#以文本的模式读文件,n代表的字节的个数
# with open(‘a.txt‘, ‘rb‘) as f:
# data=f.read(3)
# print(data.decode(‘utf-8‘))
#
#tell 当前光标所在的位置,第几个
# with open(‘a.txt‘, ‘r‘,encoding=‘utf-8‘) as f:
# data=f.read(3)
# print(f.tell())
# print(data)
# seek
# with open(‘a.txt‘, ‘r‘, encoding=‘utf-8‘) as f:
# data1 = f.read()
# print(‘1:‘,data1)
# f.seek(0)
# data2 = f.read()
# print(‘2:‘,data2)
# print(f.tell())
# f.seek(0)
#0:文件开头1:当前位置,2:文件末尾,1,2一定在byes模式下
# with open(‘a.txt‘, ‘rb‘,) as f:
# f.read(1)
# f.seek(3,1)#0,1,2
# print(f.read().decode(‘utf-8‘))
# with open(‘a.txt‘, ‘rb‘, ) as f:
# f.seek(-3, 2)
# print(f.read())
# truncate 截断文件内容
with open(‘a.txt‘, ‘w‘, encoding=‘utf-8‘) as f:
f.truncate(2)
3、文件修改
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
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.rename(‘.a.txt.swap‘,‘a.txt‘)
以上是关于文件处理的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段
你如何在 python 中处理 graphql 查询和片段?