打开文件(open):
建立用户程序与文件的联系,为文件分配一个文件缓冲区,声明文件的地址、名称及文件的处理方式等。
open()函数经常用的函数有3个,分别是filename(文件名称),mode(打开模式),encoding(文件编码方式)。其中filename不可以省略,其他参数都可以省略
文件读/写操作(read/write):
对文件的读、写、追加、和定位操作。从磁盘将数据缓冲到内存的过程称为“读文件”,从内存将数据存到磁盘的过程称为“写文件”。
关闭文件夹(close)
切断文件与用户程序的联系,把文件缓冲区的数据全部写入磁盘,释放掉该文件占用的缓存区空间,以免造成数据丢失。
访问模式
访问模式 | 说明 |
---|---|
r | 以只读的方式打开文件。文件的指针将会放在文件的开头 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
b | 二进制模式。 |
t | 文本模式 (默认),也是系统默认的文件打开方式。 |
+ | 打开一个文件进行更新(可读可写)。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
wb | 二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
实验
#只读方式打开文件并遍历输出结果
f2=open("D:\\java实验课作业\\abcd.txt",'r')
for line in f2:
print(line)
f2.close()、
#运行结果
ababababcdcdefg
指定编码类型
文件默认的编码依赖于平台。在Windows系统中,默认编码诶CP939;在Linux系统中,系统默认编码为UTF-8.代码在不同平台上将会有不同的表现。因此,当以文本模式处理文件时,要指定编码类型。
#以特定编码方式打开文件
#文件默认编码
f1=open("abcd.txt")
print('文件的默认编码方式为:',f1.encoding)
f1.close()
#打开文件时指定编码类型
f2=open('abcd.txt',mode='r',encoding='utf-8')
print('文件的默认编码方式为:',f2.encoding)
f2.close()
#运行结果
文件的默认编码方式为: cp936
文件的默认编码方式为: utf-8
关闭文件
#三种方式关闭文件
#(1)常规方式
print("(1)常规方式:")
f1=open('abcd.txt')
f1.close()
#(2)异常处理方式
print('(2)异常处理方式:')
try:
f2=open('abcd.txt')
finally:
f2.close()
#(3)使用with语句方式
print('(3)使用with语句方式:')
with open('abcd.txt') as f3:
pass
#运行结果
(1)常规方式:
(2)异常处理方式:
(3)使用with语句方式:
文件的读操作
read()方法
read()方法一次性读取文件的所有内容,并存放在一个大字符串中.
#使用read方法读取文本文件
with open('abcd.txt',mode='r',encoding='utf-8') as f1:
print(f1.read(2))
print(f1.read(2))
print(f1.read(6))
print(f1.read(8))#abcd.txt中内容为“ababababcdcdefg张三李四王国武”
#运行结果
ab
ab
ababcd
cdefg张三李
readline()方法
readline()方法是逐行读取文本文件,结果是一个list。
#使用readline方法读取文本文件
'''
abcd.txt中内容如下:
ababab
ab
cdcdefg
张三李四王国武
'''
with open('abcd.txt',mode='r',encoding='utf-8') as f1:
line=f1.readline()
while line:
line = line.rstrip('\n')
print(line)
line = f1.readline()
#运行结果
ababab
ab
cdcdefg
张三李四王国武
readlines()方法
readlines()方法一次性读取文本的所有内容,结果是一个list。readlines()读取的文件内容中,每行末尾都会带一个“\n”换行符
with open('abcd.txt',mode='r',encoding='utf-8') as f1:
for line in f1.readlines():
line_str=line.rstrip('\n')
print(line_str)
#运行结果
ababab
ab
cdcdefg
张三李四王国武
write()方法
with open('teacher.txt',mode='w',encoding='utf-8') as f1:
f1.write("我会使用Python程序设计!")
f1.write("\n")
f1.write("让我来教大家学习Python程序设计。")
f1.write("\n")
#读操作
with open('teacher.txt',mode='r',encoding='utf-8') as f2:
for line in f2.readlines():
line_str=line.rstrip('\n')
print(line_str)
#运行结果
我会使用Python程序设计!
让我来教大家学习Python程序设计。
#w+是读入之后重写覆盖,a+是读入后追加,r只能读,将指针放开头,+是更新的意思,r+就代表只能更新已有的文件,否则包找不到文件的错误,
writelines()方法
list = ('先易后南,','\n','循序渐进','\n')
with open('teacher.txt',mode='a',encoding='utf-8') as f2:
f2.writelines(list)
with open('teacher.txt',mode='r',encoding='utf-8') as f4:
for line in f4.readlines():
line_str=line.rstrip('\n')
print(line_str)
#运行结果
我会使用Python程序设计!
让我来教大家学习Python程序设计。
先易后南,
循序渐进
Python中有一个os模块,os提供了许多便利的方法来管理文件和目录。
#os.remove()方法:使用remove方法来删除文件
import os
file_name='test.txt'
if os.path.exists(file_name):
os.remove(file_name)
print(file_name+"文件删除成功")
else:
print(file_name+'文件未找到')
#os.mkdir()方法:创建指定名称的目录
import os
dir_str=os.getcwd()#os.getwd()查看当前目录位置,便于接下来检查所要创建的目录是否存在,然后在创建目录
my_dir="PythonFile"
if not os.path.exists(my_dir):
os.mkdir(my_dir)
print("当前目录为:"+dir_str+"。在该目录下,"+my_dir+"目录创建成功!")
else:
print("当前目录为:"+dir_str+"。在该目录下,"+my_dir+"目录已经存在!")
#运行结果
# 当前目录为:D:\pycharm\py代码\Python期末。在该目录下,PythonFile目录创建成功!
#使用rmdir()方法来删除目录
import os
dir_str=os.getcwd()
my_dir='PythonFile'
if os.path.exists(dir_str):
os.rmdir(my_dir)
print(my_dir+"目录以删除成功!")
else:
print(my_dir+'目录未找到!')
#运行结果
#PythonFile目录以删除成功!
#使用os.system()方法来完成文件或目录操作
import os
dir_str=os.path.dirname(__file__)
os.system('cls')
os.system('mkdir PythonFile2')
os.system('copy teacher.txt PythonFile2\\teacher2.txt')
file_name=dir_str+"PythonFile2\\teacher2.txt"
os.system("notepad"+file_name)
#运行结果可以看到一个新创建的PythonFile2文件目录,其中teacher2.txt是由teacher.txt复制得到的
#使用os.rename()为文件重命名
import os
file_name='abcd.txt'
file_name_new='test_new.txt'
if os.path.exists(file_name):
os.rename(file_name,file_name_new)
print("文件冲命名为:"+file_name_new)
else:
print(file_name+"文件不存在!")
#文件冲命名为:test_new.txt
#使用walk()方法来搜索指定目录及其子目录
#os.walk返回包括3个元素的元组(dirpath,dirname,filenames)
#dirpath:以字符串的形式返回该目录下的绝对路径
#dirname:以列表的形式返回每一个绝对路径下的目录
#filename:以列表的形式
import os
cur_path=os.path.dirname(__file__)
cur_path+='/PythonFile2'
sample_tree=os.walk(cur_path)
for dir_name,sub_dir,files in sample_tree:
print('文件路径:',dir_name)
print('目录列表:',sub_dir)
print('文件列表:',files)
##运行结果
# 文件路径: D:/pycharm/py代码/Python期末/PythonFile2
# 目录列表: []
# 文件列表: ['teacher2.txt']
#将一维数据写入CSV格式文件
list=['苹果','葡萄','香蕉','西瓜']
f1=open("shuiguo.csv",'w',encoding='utf-8')
f1.write(','.join(list)+'\n')
f1.close()
#从csv格式文件读取一维数据
f2=open("shuiguo.csv",'r',encoding='utf-8')
list=f2.read().strip('\n').split(',')
f2.close()
print(list)
#运行结果
['苹果','葡萄','香蕉','西瓜']
#将二维数组写入CSV格式文件
list=[
['水果名称','单价','个数','金额'],
['葡萄','20','2.5','50'],
['苹果','30','5','150'],
['西瓜','50','6','300']
]
f3_name='shuiguoqingdan.csv'
f3=open(f3_name,'w',encoding='utf-8')
for row in list:
f3.write(','.join(row)+'\n')
print("数据写入",f3_name,'成功')
f3.close()
#从csv格式文件读取二维数据
f4_name='shuiguoqingdan.csv'
f4=open(f4_name,'r',encoding='utf-8')
list=[]
for line in f4:
list.append(line.strip('\n').split(','))
f4.close()
print(list)
#运行结果
# [['水果名称', '单价', '个数', '金额'], ['葡萄', '20', '2.5', '50'], ['苹果', '30', '5', '150'], ['西瓜', '50', '6', '300']]