打开文件
- 基本语法:file = open(‘文件名’,mode)
- mode: 打开一个文件:r,写入一个文件:w,追加一些信息:a,操作二进制文件:b,又可以加又可以读:+
访问方式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。如果文件不存在,抛出异常 |
w | 以只写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件 |
a | 以追加方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入 |
r+ | 以读写方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常 |
w+ | 以读写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件 |
a+ | 以读写方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入 |
- 写文件
# 写一个文件
# 创建一个文件后存储在和代码一个文件夹里面
myfile = open('hello world.txt', 'w')
myfile.write('di\n')
myfile.write('helloworld\n')
myfile.close()
- 读文件
文件名需要注意大小写
文件指针:文件指针 标记 从哪个位置开始读取数据,第一次打开 文件时,通常 文件指针会指向文件的开始位置。当执行了 read 方法后,文件指针 默认情况下会移动到 读取内容的末尾。
# 读取一个文件
f = open('hello world.txt', 'r')
print(f.read())
# r的作用相当于一个指针,读取结束之后再读取就不会有任何操作了
print(f.read())
# 读取第一行
print(f.readline())
# readlines是一个列表,读取所有的行数
l = open('hello world.txt').readlines()
- 关闭文件
记得一定要关闭文件,否则就会出现:Python 程序不报错,但是f.write()写不进内容,始终保持空白
问题博客参考
文件名.close()
读写一个二进制文件
二进制文件不是给人直接阅读的,而实提供给其他软件使用的,不能使用文本编辑软件查看
f = open('data.bin', 'b').read()
pickle的应用
pickle是将一个对象存入一个文件里面
import pickle
person = {'name': 'di', 'age': 22}
# 将对象序列为字符串
s = pickle.dumps(person)
print(s)
# 从字符串反序列化为对象
p = pickle.loads(s)
print(p)
# 将序列字符串存入文件中
a = pickle.dump(person, open('pickle_db', 'wb'))
open('pickle_db', 'rb').close()
# 从文件中载入对象
b = pickle.load(open('pickle_db', 'rb'))
print(b)
- pickle存入文件
存储二进制文件允许将具体的数据类型存进去,这里存入一个字典类型,d = {'a': 1, 'b': 2}
,接着创建一个二进制文件方便写入:f = open('datafile.pkl', 'wb')
,导入模块:import pickle
,将具体的数据类型写入二进制文件:pickle.dump(d, f)
,写入文件之后记得关闭:f.close()
。
接下来尝试将二进制文件打印出来,print(open('datafile.pkl', 'rb').read())
,但是这个读取不符合人的习惯,那么如何读取二进制文件里面的具体类型呢?data = pickle.load(open('datafile.pkl', 'rb'))
,print(data)
坑:读取二进制文件的时候,后面模式必须加上,否则就会读取错误
shelve的应用
将多个对象存储在一个文件里面,给不同的对象加多个键值
import shelve
scores = [99, 88, 77]
student = {'name': 'Di', 'age': 18}
# 创建一个数据库文件存储我们需要的信息
db = shelve.open('shelve_student')
# 赋值文件,保存键的类型特征
db['s'] = student
db['score'] = scores
print(len(db))
# 直接访问就可以
print(db['s'])
print(db['score'])
# 全局删去变量
del db['score']
print(len(db))
# 关闭数据库
db.close()
with写法:自动关闭文件
# with
with open('course.txt', encoding='utf-8') as f:
for line in f.readlines():
print(line)
- 打开带有中文的文件,记得要加上
encoding='utf-8'
- 采用with的格式,系统用完文件之后会自动释放,推荐采用这种方法,不用再写
文件名.close()
文件复制
小文件复制
打开一个已有文件,读取完整内容,并写入到另外一个文件
# 1. 打开文件
with open('course.txt', encoding='utf-8') as file_read:
text = file_read.read()
with open('course_duplicate.txt', 'w', encoding='utf-8') as file_write:
file_write.write(text)
大文件复制
# 1. 打开文件
file_read = open("README")
file_write = open("README[复件]", "w")
# 2. 读取并写入文件
while True:
# 每次读取一行
text = file_read.readline()
# 判断是否读取到内容
if not text:
break
file_write.write(text)
# 3. 关闭文件
file_read.close()
file_write.close()