文件与文件系统
- 文件读取
- 打开文件
- 读取文件
- 写和创建文件
- 关闭文件
- 删除文件
- 使用json保存结构化数据
文件读取
打开文件
打开文件使用Python内置方法:open()open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 是用于解码或编码文件的编码的名称,默认编码是依赖于平台的。
- errors: 是一个可选的字符串参数,用于指定如何处理编码和解码错误
- newline: 区分换行符
- opener: 自定义开启器
虽然open()有怎么多参数,但常用的有两个参数:filename和mode。通过调用open函数,会返回一个file object。
可用的mode
有:
字符 | 含义 |
‘r’ | 读取(默认) |
‘w’ | 写入,并先截断文件 |
‘x’ | 排它性创建,如果文件已存在则失败 |
‘a’ | 写入,如果文件存在则在末尾追加 |
‘b’ | 二进制模式 |
‘t’ | 文本模式(默认) |
‘+’ | 打开用于更新(读取与写入) |
现在,让我们来打开一个文件。
file =open('test.txt')
print(file) #<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'>
print(file.read())
# this is a test file.
# hello world.
可以看到,我们已默认读的模式读取了当前文件夹中的test.txt文件。返回了一个file object 。同时通过其内置方法read()。得到了文件中的内容。
读取文件
读取文件的方法有很多种,read()方法默认会读取整个文件。也可指定size读取选定的字节数。
- fileObject.read([size]) :用于从文件读取指定的字符数,如果未给定或为负则读取所有。
注意:此时文件需为读模式,当文件不存在时,程序会报错。
按字节读取:
file =open('test.txt')
print(file.read(9)) #this is a
print(file.read(9)) # test fil
读取所有:
file =open('test.txt')
print(file.read())
#this is a test file.
#hello world.
若要按行读取,可使用readline()方法:
- fileObject.readline():读取整行,包括 “\n” 字符
f=open("test.txt")
print(f.readline())
#this is a test file.
#
print(f.readline())
#hello world.
用for循环迭代文件,对行进行读取。
f=open("test.txt")
for eachline in f:
print(eachline)
#this is a test file.
#hello world.
写和创建文件
若想对我文件进行写入操作,可使用write()方法:
- fileObject.write(str):用于向文件中写入指定字符串,返回的是写入的字符长度。
注意:此时文件需要以“a”或“w”模式打开。当文件路径不存在时,会自动创建文件。
#以'w'模式打开文件
f =open('test_2.txt',mode='w')
#写入文件
f.write("hello world\nI creat a file")
f.close()
#以'a'和'r'模式打开文件
f=open('test_2.txt',mode="a+")
#在末尾添加新的行
f.write("\nadd one line")
#跳转回文件开头
f.seek(0,0)
print(f.read())
#hello world
#I creat a file
#add one line
关闭文件
虽然Python的垃圾回收器最终将关闭打开的文件,但为了避免不必要的麻烦,最好还是记得及时关闭文件。
关闭文件可以显式的调用close()方法。
- fileObject.close():用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发ValueError错误。
f=open("test.txt")
print(f.read())
#关闭文件
f.close()
#关闭文件后再使用文件将会报错
f.read()
# Traceback (most recent call last):
# File "e:\pythonstudy\file\fileclose.py", line 4, in <module>
# f.read()
# ValueError: I/O operation on closed file.
相较于显式调用close()方法,我们往往更常用with语句。with语句的优点是当子句体结束后文件会正确关闭,即使在某个时刻引发了异常。 而且使用 with 相比等效的 try-finally 代码块要简短得多:
with open("test.txt") as f:
print(f.read())
#with子句结束后,文件自动关闭
f.read()
# Traceback (most recent call last):
# File "e:\pythonstudy\file\filewith.py", line 5, in <module>
# f.read()
# ValueError: I/O operation on closed file.
删除文件
如果要删除一个文件,我们可以调用os模块,然后使用os.remove()函数:
import os
os.remove("test.txt")
若要删除文件夹,使用os.rmdir()函数:
import os
os.rmdir("newfolder")
为了避免操作文件时因为文件不存在而出现错误,再操作文件前最好检查一下文件是否存在。
import os
if os.path.exists("test.txt"):
os.remove("test.txt")
else:
print("The file does not exist")
使用json保存结构化数据
对于字符串数据,我们可以很轻松的在文件中存取。但对于诸如嵌套列表和字典这样的复杂数据类型时,读取时解析操作就会比较麻烦。
因此Python允许我们使用称为 JSON (JavaScript Object Notation) 的流行数据交换格式,而不是让用户不断的编写和调试代码以将复杂的数据类型保存到文件中。名为 json 的标准模块可以采用 Python 数据层次结构,并将它们转化为字符串表示形式。
import json
x=[1,2,3,"name","world"]
filename="josn_file.json"
#存入
with open(filename,"w") as f:
json.dump(x,f)
#读取
with open(filename) as f:
x=json.load(f)
print(x)