读取文件
建一个txt文件,命名为data.txt内容如下:
Hello, my name is Jack.
I'm 25 years old.
另新建一个read_file.py文件,并将data.txt与read_file.py文件置于同一目录下
开始用代码读取data.txt中的内容
with open('data.txt') as file_txt:
contents = file_txt.read()
print(contents)
输出:
Hello, my name is Jack.
I’m 25 years old.
open
方法会打开一个文件,并返回一个文件对象(file对象)
as
将返回的file对象重新命名,方便使用
file.read()
表示读取文件中内容
在读取文件的时候,需要对文件进行打开操作,在操作完毕后,必须将文件关闭,否则该文件会一直被占用,opne()
可以打开文件,close()
则将文件关闭;但是如果程序有报错等问题,代码会无法执行到close()
语句上;with
关键字表示在访问文件一旦不再被访问,则将文件关闭,这样避免了忘记关闭或未正常关闭的风险
open()参数
file object = open(file_name [, access_mode][, buffering])
file_name
是文件名,如果与代码文件在同一目录,则只提供文件名即可,如果不在同一目录下,则需要按相对路径或绝对路径的方式传入文件的地址
绝对路径就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件
相对路径就是以当前文件为基准进行一级级目录指向被引用的资源文件
../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)
例如,data.txt的地址在C:\Users\Administrator\Desktop\code\data
目录下,read_file.py文件在C:\Users\Administrator\Desktop\code\code
目录下
# 相对路径
file1 = open('../data/data.txt')
# 等同于 file1 = open('..\\data\\data.txt')
print(file1.read())
file1.close()
# 绝对路径
file2 = open(r'C:\Users\Administrator\Desktop\code\data\data.txt')
print(file2.read())
file2.close()
注意,windows平台下,表示路径层级关系时用反斜杠\
,而\
又表示转译的意思,因此需要通过\\
来表示一个实际意义上的反斜杠,也可以在文件地址字符串前加一个r
,告诉Python这是一个地址,不要对\
进行转译
access_mode
是一个可选的参数,表示打开的方式,常用可取值如下:
r
以只方式打开文件,这是默认模式,从头开始读取r+
打开文件并支持读写,从头开始读写w
打开文件只允许写入,如果文件存在,则从头开始写入(原文件被覆盖),如果文件不存在,则创建新文件w+
打开文件用于读写,如果文件存在,则从头开始读写(原文件被覆盖),如果文件不存在,则创建新文件a
打开一个文件用于追加(写入),即文件被写入到末尾;如果文件不存在,则会创建新文件a+
打开一个文件用于在末尾读写,如果文件不存在 ,则会创建新文件
buffering
是一个可选参数,表示寄存区大小,略
上面例子中,read()
是将整个文件读取出来的,如果想要一行一行的读取文件,可以使用循环
# 将文件地址保存到一个变量中
fine_name = '../data/data.txt'
# 打开文件,按行循环处理
with open(fine_name) as file_txt:
for line in file_txt:
print(line)
输出:
Hello, my name is Jack.
I’m 25 years old.
中间有空行,因此在txt文件末尾有一个看不见的换行符,所以打印出来后会多出来空行
# 将文件地址保存到一个变量中
fine_name = '../data/data.txt'
# 打开文件,按行循环处理
with open(fine_name) as file_txt:
for line in file_txt:
print(line.strip())
输出:
Hello, my name is Jack.
I’m 25 years old.
使用strip()
函数去除多余的空行(strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列)
另一种方法
# 将文件地址保存到一个变量中
fine_name = '../data/data.txt'
# 打开文件,按行循环处理
with open(fine_name) as file_txt:
lines = file_txt.readlines()
# 输出内容
for line in lines:
print(line.strip())
输出:
Hello, my name is Jack.
I’m 25 years old.
readlines()
将文件中的内容按行读取,并存储到一个列表中
虽然lines
变量是在with
代码块中定义的,但是在with
代码块之外依然可以访问得到
写入文件
# 将文件地址保存到一个变量中
fine_name = '../data/data.txt'
# 打开文件,按行循环处理
with open(fine_name, 'w+') as file_txt:
file_txt.write('I like playing basketball!')
运行结果:
原来的内容被覆盖,在开头写入一新内容
写入多行
这里要强调的是,因为在写入文件的时候,一行内容结尾是没有换行符的,所以如果要写入多行内容,需要手动添加换行符
# 将文件地址保存到一个变量中
fine_name = '../data/data.txt'
# 打开文件,按行循环处理
with open(fine_name, 'w+') as file_txt:
file_txt.write('I like playing basketball!\n')
file_txt.write("I don't like vegetables!\n")
运行结果:
如果不想将原有的内容覆盖掉,可以使用a
参数
# 将文件地址保存到一个变量中
fine_name = '../data/data.txt'
# 打开文件,按行循环处理
with open(fine_name, 'a') as file_txt:
file_txt.write('I like playing basketball!\n')
file_txt.write("I don't like vegetables!\n")
运行结果:
新的内容被追加到原有内容的末尾
对文件进行重命名、删除等操作
import os
# 重命名文件test1.txt到test2.txt。
os.rename( "../data/data.txt", "../data/data_file.txt" )
运行结果
rename()
方法存在于os模块下,所以必须先引用os模块
删除文件
os.remove('../data/data_file.txt')
文件夹操作
创建文件夹
import os
# 在当前目录下创建new_file文件夹
os.mkdir("new_file")
运行结果:
删除文件夹
os.rmdir('new_file')
new_file文件夹将删除
json数据
保存json数据
# 引用json模块
import json
# 要保存的内容
words = "hello world!"
# 保存地址
filename = 'hello.json'
# 打开文件写入json数据
with open(filename,'w') as f:
json.dump(words, f)
读取json数据
# 引用json模块
import json
# 保存地址
filename = 'hello.json'
# 打开文件写入json数据
with open(filename,'r') as f:
words = json.load(f)
print(words)
json.dump()
存储数据
json.load()
加载数据