1. 初识文件处理
-
python中的文件操作步骤:打开文件、操作文件、关闭文件。
-
需要操作的文件与py的执行文件在相同路径下时,直接指定文件名即可,如果不在同一目录时,需要指定所操作文件的绝对路径。
-
指定文件的绝对路径时,需要取消转译的方式来表示:1(\),2(路径前的括号前加r)。
-
文件操作需要指定文件的操作句柄,又叫文件操作符、文件操作对象。
-
del f:主动释放一个python程序中内存中的变量,可写看不写,程序执行完会自动释放。
-
python中打开文件的方法是open,open('文件名','打开模式,'文件编码')
-
python中打开文件的模式是只读('r')
-
python中打开文件的默认编码是操作系统的默认编码
-
判断文件是否可读:readable()
f = open('yan', 'r', encoding='utf-8')
print(f.readable())
print(f.writable())
f.close()
>>>
True
False
f = open('yan', 'w', encoding='utf-8')
print(f.readable())
print(f.writable())
f.close()
>>>
False
True
-
python中关闭文件使用close()
-
打开的文件不会自动关闭,必须使用close()方法关闭
-
不管是读文件还是写文件,都会识别换行符
-
python中的文件操作没有修改和删除的方法,只能通过其他操作途径来做
2. 文件写操作
-
文件操作写模式使用:w,以w的方式打开一个文件,如果文件不存在,会自动创建此文件;如果文件存在,先清空文件内容,再往里写数据。
f = open('yan', 'w', encoding='utf-8')
f.write('liyan')
f.write('888')
f.write('\n岩哥')
f.close()
>>>(文件内容)
liyan888
岩哥
3. 文件读操作
- 文件操作读模式使用:r,默认文件操作的打开方式是(r),所以r可写可不写
-
读文件的第一种方式:使用read()方法一次性读出文件中的所有内容
f = open('yan', 'r', encoding='utf-8')
print(f.read())
>>>
liyan
888
岩哥
-
读文件的第二种方式:使用read(n)可以指定读取文件中n个单位
f = open('yan', 'r', encoding='utf-8')
print(f.read(3))
>>>
liy
-
读文件的第三种方式:使用readline()逐行读取文件中的内容
f = open('yan', 'r', encoding='utf-8')
print(f.readline())
print(f.readline())
print(f.readline())
>>>
liyan
888
岩哥
-
读文件的第四种方式:使用readlines()返回一个列表。把内容中所有内容都读取出来,并把每一行当作一个元素加入到列表中显示出来,每一个元素都会有一个'\n'换行符
f = open('yan', 'r', encoding='utf-8')
print(f.readlines())
>>>
['liyan\n', '888\n', '岩哥']
-
读文件的第五种方式:也是最常用的一种方式,直接以for循环的方式读取出文件中每一行的内容。使用strip()方法,可以过滤空行,只显示文件中有内容的行
f = open('yan', 'r', encoding='utf-8')
for line in f:
print(line.strip())
>>>
liyan
888
岩哥
4. 文件处理模式
-
a:以追加的方式把内容写到文件最后(一定注意换行符的合理使用)
f = open('yan', 'a', encoding='utf-8')
f.write('这是追加的内容')
f.write('\n注意换行符')
>>>(文件内容)
liyan
888
岩哥这是追加的内容
注意换行符
-
rb、wb、ab:以二进制的方式读、写、追加文件操作。一般操作图片、音频、视频等文件时用到,在网络编程时,或数据传输(上传、下载)时居多,默认是以二进制的方式操作文件,所以在打开文件时就不需要再指定文件编码了。
-
r+:可读可写(1.先读后写,写是追加;2.先写后读,从头开始写)
-
w+:可写可毒,其实就是直接把文件清空(1.尽管可读,但是读取的都是当前打开后新写入文件的内容;2.光标的最后,读取的信息为空,需要主动移动光标才可度到文件内容)
-
a+:追加可读(在文件最后追加内容,但是读取只仍需要移动光标才可以读取)
-
常用的文件操作,要么读、要么写、要么追加,很少用到读写、写读同时使用的情况。常用的有:r、w、a、rb、wb、ab
5. 文件内的光标移动
-
seek:光标移动到第几个字节的位置
-
f.seek(0):移动到文件内容最开始的位置
-
f.seek(0,2):移动到文件内容最结尾的位置
-
tell:输出当前光标位置在第几个字节
-
truncate(n):指定文件中保留n个字节,其他的全部清除
6. 文件的修改操作
-
创建一个新文件
-
把原文件的内容读取出来
-
把读取的文件内容做修改操作
-
把修改后的文件内容写入到新文件中
-
删除原文件,重命名新文件名
-
示例:
# 替换原文件yan.txt的'原来'为'新','old'为'new'
# 下列是原文件yan.txt中的内容
"""
原文件中的内容:
old file content
"""
# 导入os模块用于调用系统命令
import os
# 1. 创建一个新文件
fw = open('yan_new.txt', 'w', encoding='utf-8')
# 2. 把原文件的内容读取出来
fr = open('yan.txt', encoding='utf-8')
for i in fr:
if i.strip():
# 3. 把读取的文件内容做修改操作
old_content = i.replace('原', '新').replace('old', 'new')
# 4. 把修改后的文件内容写入到新文件中
fw.write(old_content)
fr.close()
fw.close()
# 5. 删除原文件,重命名新文件名
os.remove('yan.txt')
os.rename('yan_new.txt', 'yan.txt')
>>>(执行代码后新文件[文件名不变]的内容)
新文件中的内容:
new file content
7. 文件删除操作
-
文件删除操作需要调用系统命令
-
文件删除跟文件修改的最后一步一样,直接导入os模块,然后使用系统命令os.remove即可
-
示例:
import os
os.remove('yan.txt')
>>>
# 当前目录下yan.txt已经不存在了
8. with语句操作文件
-
with语句等于文件的打开和关闭
-
with语句不需要close()关闭文件
-
示例:
with open('yan.txt', encoding='utf-8') as f:
for i in f:
print(i.strip())
>>>
with...
# 替换原文件yan.txt的第二个old为new
# 下列是原文件yan.txt中的内容
"""
1.old的内容
2.old....
3.the old...
"""
import os
with open('yan.txt', encoding='utf-8') as f, open('yan_new.txt', 'w', encoding='utf-8') as fw:
count = 0
for i in f:
if i.strip() and count == 1:
new_content = i.replace('old', 'new')
fw.write(new_content)
else:
fw.write(i)
count += 1
os.remove('yan.txt')
os.rename('yan_new.txt', 'yan.txt')
>>>(执行代码后新文件[文件名不变]的内容)
1.old的内容
2.new....
3.the old...
9. 文件操作应用
'''
如下是文件shopping中的内容,分别使用列表嵌套字典和字典嵌套列表的方式读取出来。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
'''
# (1) 列表嵌套字典:
f = open('shopping', encoding='utf-8')
goods_list = []
for i in f:
goods_dict = {}
i = i.strip()
if i:
# print(i)
goods_list_tmp = i.split()
# goods_dict[goods_list_tmp[0]] = goods_list_tmp[1:]
goods_dict['name'] = goods_list_tmp[0]
goods_dict['price'] = goods_list_tmp[1]
goods_dict['number'] = goods_list_tmp[2]
goods_list.append(goods_dict)
print(goods_list)
>>>
[{'name': 'apple', 'price': '10', 'number': '3'}, {'name': 'tesla', 'price': '100000', 'number': '1'}, {'name': 'mac', 'price': '3000', 'number': '2'}, {'name': 'lenovo', 'price': '30000', 'number': '3'}, {'name': 'chicken', 'price': '10', 'number': '3'}]
# (2) 字典嵌套列表:
f = open('shopping', encoding='utf-8')
goods_dict = {}
for j in f:
j = j.strip()
if j:
goods_list = j.split()
goods_dict[goods_list[0]] = goods_list[1:]
print(goods_dict)
>>>
{'apple': ['10', '3'], 'tesla': ['100000', '1'], 'mac': ['3000', '2'], 'lenovo': ['30000', '3'], 'chicken': ['10', '3']}