文件操作相关知识
文本文件和二进制文件
- 打开文件
- 读写文件
- 读文件:将文件数据读入内存
- 写文件:将内存内容写入文件
- 关闭文件
操作文件的函数/方法
| 序号 | 函数 | 说明 | | —- | —- | —- | | 1 | open | 打开文件,返回文件操作对象 | | 2 | read | 将文件内容读入内存 | | 3 | write | 将指定内容写入文件 | | 4 | close | 关闭文件 |
- open函数负责打开文件,并且返回文件对象
- read/write/close三个方法都需要通过文件对象来调用。
- open函数:
- 第一个参数是文件名(区分大小写),第二个参数是打开方式;
- 如果文件存在返回文件操作对象
- 如果文件不存在抛出异常
- read函数:可以一次性读入并返回文件所有内容;
```python
1. 打开 - 文件名需要注意大小写
file = open(“README”)
2. 读取
text = file.read() print(text)
3. 关闭
file.close()
<a name="xOiVj"></a>### 文件打开方式> f = open("文件名","打开方式")| 访问方式 | 说明 || --- | --- || r | 以**只读**的方式打开文件。文件的指针会放在文件的开头,这是**默认模式**。如果文件不存在抛出异常 || w | 以**只写**方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件 || a | 以**追加**方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不<br />存在,创建新文件进行写入 || r+ | 以**读写**方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常 || w+ | 以**读写**方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件 || a+ | 以**读写**方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不<br />存在,创建新文件进行写入 |对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存<br />储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)- rb- wb- ab注:- 以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码- 频繁的移动文件指针,会影响文件的读写效率,开发中更多的时候会以 只读、只写 的方式来操作文件<a name="ESUA2"></a>### 按行读取文件内容- read方法一次性将文件所有内容读取到内存- readline方法可以一次读取一行内容,读完之后指针移动到下一行准备再次读取```python# 方式一、通过循环按行读取文件所有内容file1 = open("README.txt")i = 1while True:text1 = file1.readline().strip()if text1:print("这是第%s行内容" % i)i += 1print(text1)else:breakfile1.close()# 方式二、通过for遍历按行读取文件所有内容file2 = open("README.txt")for i in file2.readlines():print(i.strip())file2.close()
with结构
在操作完毕文件后,一定要记住f.close(),推荐操作方式:使用with关键字来帮我们管理上下文。
用with结构打开的文件会在文件操作结束后自动关闭文件。
with open("README.txt", "r") as read_f,open("README[BACKUP].txt", "w") as write_f:while True:text = read_f.readline()if not text:breakwrite_f.write(text)print(text)with open("README.txt", "r") as read_f,open("README[BACKUP].txt", "w") as write_f:for i in read_f.readlines():write_f.write(i)print(i)
文件编码
f=open(…)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明
显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是
utf-8。
f=open('a.txt','r',encoding='utf-8')
文件操作方法
def close(self, *args, **kwargs): # real signature unknown关闭文件passdef fileno(self, *args, **kwargs): # real signature unknown文件描述符passdef flush(self, *args, **kwargs): # real signature unknown刷新文件内部缓冲区passdef isatty(self, *args, **kwargs): # real signature unknown判断文件是否是同意tty设备passdef read(self, *args, **kwargs): # real signature unknown读取指定字节数据passdef readable(self, *args, **kwargs): # real signature unknown是否可读passdef readline(self, *args, **kwargs): # real signature unknown仅读取一行数据passdef seek(self, *args, **kwargs): # real signature unknown指定文件中指针位置passdef seekable(self, *args, **kwargs): # real signature unknown指针是否可操作passdef tell(self, *args, **kwargs): # real signature unknown获取指针位置passdef truncate(self, *args, **kwargs): # real signature unknown截断数据,仅保留指定之前数据passdef writable(self, *args, **kwargs): # real signature unknown是否可写passdef write(self, *args, **kwargs): # real signature unknown写内容passdef __getstate__(self, *args, **kwargs): # real signature unknownpassdef __init__(self, *args, **kwargs): # real signature unknownpass@staticmethod # known case of __new__def __new__(*args, **kwargs): # real signature unknown""" Create and return a new object. See help(type) for accurate signature."""passdef __next__(self, *args, **kwargs): # real signature unknown""" Implement next(self). """passdef __repr__(self, *args, **kwargs): # real signature unknown""" Return repr(self). """pass
案例一:文件的修改
文件的数据是存放在硬盘上的,因此只存在覆盖、不存在修改的说法,我们平时修改文件看到的都是模拟出来的效果,具体有两种实现方法:
将文件全部读入到内存,内存是可以修改的,将内存里修改好的文件覆盖到硬盘上的原文件。
import oswith open('a.txt') as read_f,open('a.txt.new','w') as write_f:data = read_f.read()data = data.replace('Hello','nihao')write_f.write(data)os.remove('a.txt')os.rename('a.txt.new','a.txt')
将文件一行一行读入到内存,修改好后,覆盖原文件
import oswith open('a.txt') as read_f,open('a.txt.new','w') as write_f:for line in read_f:line = line.replace('nihao','Hello')write_f.write(line)os.remove('a.txt')os.rename('a.txt.new','a.txt')
案例二:文件的复制
```python with open(“README.txt”, “r”) as read_f,open(“README[BACKUP].txt”, “w”) as write_f: while True:
text = read_f.readline()if not text:breakwrite_f.write(text)print(text)
with open(“README.txt”, “r”) as read_f,open(“README[BACKUP].txt”, “w”) as write_f: for i in read_f.readlines(): write_f.write(i) print(i)
———————————————————————————————————————-
小文件复制
file1 = open(“README”, “r”) file2 = open(“README[复件]”, “w”) text = file1.read() file2.write(text) file1.close() file2.close()
———————————————————————————————————————-
大文件复制
file3 = open(“README”, “r”) file4 = open(“README[大文件复制]”, “w”) while True: text = file3.readline() if not text: break file4.write(text) file3.close() file4.close()
<a name="IOp6i"></a># 案例三:计算总价文件a.txt内容:每一行内容分别为商品名字,价钱,个数。<br />apple 10 3<br />tesla 100000 1<br />mac 3000 2<br />lenovo 30000 3<br />chicken 10 3<br />通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},<br />{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。```pythonlist1 = []with open("a.txt", "r", encoding="utf-8") as file:for line in file.readlines():text = line.strip().split(" ")dict1 = {"name": text[0], "price": text[1], "amount": text[2]}list1.append(dict1)passprint(list1)price = 0for i in list1:price += int(i["price"]) * int(i["amount"])passprint(price)
