文件打开与关闭
1、文件概念
文件指存储在外部介质(如磁盘等)上有序的数据集合,这个数据集有一个名称,称为文件名。按数据的组织形式不同,可以将文件分为文本文件和二进制文件两大类。
(1)文本文件:一般由单一特定编码的字符组成,如UTF-8编码,内容容易统一展示和阅读。
(2)二进制文件:直接由比特0和比特1组成,没有统一字符编码,文件内部数据的组织格式与文件用途有关。
2、文件打开
Python内置了文件对象,通过open()函数即可按照指定模式打开指定文件,并创建文件对象,有两种方式:
(1)普通方式打开
其语法格式如下图所示。
(2)with语句方式
Python中的with语句用于对资源进行访问,保证不管处理过程中是否发生错误或者异常,都会执行规定的__exit__(清理)操作,释放被访问的资源,常用于文件操作、数据库连接、网络通信连接、多线程与多进程同步时的锁对象管理等场合。其语法格式如下图所示。
用于文件内容读写时,with语句的用法如下:
with open(文件名[,打开方式]) as文件对象名: #通过文件对象名读写文件内容语句
3、文件关闭
在Python中,虽然文件会在程序退出后自动关闭,但是考虑到数据的安全性,在每次使用完文件后,都需要使用close()方法关闭文件,其语法格式如下:
文件对象名.close()
4、快速体验
以只写方式打开一个名为“test.txt”的文件,然后关闭文件,代码如下:
file = open('test.txt','w') #以只写方式打开一个名为“test.txt”的文件
file.close() #关闭文件
5、说明
(1)程序执行完毕后,系统会自动关闭由该程序打开的文件,但计算机中可打开的文件数量是有限的,每打开一个文件,可打开文件数量就减一;打开的文件占用系统资源,若打开的文件过多,会降低系统性能。因此,编写程序时应使用close()方法主动关闭不再使用的文件。
(2)由于文件的编码方式有多种,所以打开文件,常常要指明编码方式: open(file, mode='r', encoding=None) 主要在读取中文文件要使用,常用中文编码见下表。
文件读写操作
1.写文件
1、write()方法
(1)语法: write()方法用于向文件中写入指定字符串,其语法格式如下:
文件对象名.write(str)
(2)快速体验: 向文件“testfile.txt”文件中写入如下数据。
Interface options
Generic options
Miscellaneous options
Options you shouldn’t use
【问题分析】 首先以只写方式打开文件(当文件不存在时会创建文件); 然后向文件中写入数据,这里需要注意的是 write()方法不会自动在字符串的末尾添加换行符,因此,当输入多行时,需要在 write()语句中包含换行符; 最后关闭文件。
【参考代码】
import os
os.chdir("D:\教材\Python\数据集(改成你自己的路径)")
file = open('testfile.txt','w') #打开名为“testfile.txt”的文件
#向文件中输入字符串
file.write('Interface options\n')
file.write('Generic options\n')
file.write('Miscellaneous options\n')
file.write('Options you shouldn’t use\n')
file.close() #关闭文件
程序运行后,会在D:\教材\Python\数据集路径下生成一个名为“testfile.txt”的文件,打开该文件,可以看到数据被成功写入到文件中。
2、writelines()方法
(1)语法: writelines()方法用于向文件中写入一序列的字符串,其语法格式如下:
文件对象名.writelines(sequence)
(2)快速体验: 使用 writelines()方法向已有的“testfile.txt”文件中追加如下数据。
Environment
variables
【问题分析】 要向文件中追加数据,需要用追加方式“a”打开文件。使用 writelines()方法写入数据时,同样不会自动在列表后面增加换行符,需要手动加入。这里使用 with语句进行文件操作。
【参考代码】
ls = ['Environment\n','variables']
with open('testfile.txt','a') as file:
file.writelines(ls) #向文件中追加字符串列表
【运行结果】 程序运行后,会将数据追加到“testfile.txt” 文件中。
2.读文件
1、read()方法
(1)语法: read()方法用于从文件中读取指定的字节数,如果未给定参数或参数为负,则读取整个文件内容,其语法格式如下:
文件对象名.read([size])
size为从文件中读取的字节数,该方法返回从文件中读取的字符串。
(2)快速体验: 使用 read()方法读取“testfile.txt”文件。
【参考代码】
with open('testfile.txt','r') as file: #以只读方式打开原有的名为“testfile.txt”的文件
line = file.read(10) #读取前 10 个字节
print(line) #输出前 10 个字节
print('*'*30) #输出 30 个*用于分隔
content = file.read() #读取文件中剩余的所有内容
print(content) #输出
【运行结果】 程序运行结果如下:
Interface
******************************
options
Generic options
Miscellaneous options
Options you shouldn’t use
Environment
variables
2、readline()方法
(1)语法: readline()方法用于从文件中读取整行,包括“\n”字符。如果指定了一个非负数的参数,则表示读入指定大小的字符串,其语法格式如下:
文件对象名.readline([size])
(2)快速体验: 使用readline()方法读取“testfile.txt”文件。
【参考代码】
with open('testfile.txt','r') as file: #以只读方式打开原有的名为“testfile.txt”的文件
line = file.readline() #读取一行
print(line) #输出
print('*'*30) #输出30个*用于分隔
line = file.readline(10) #读取下一行的前10个字符
print(line) #输出
【运行结果】 程序运行结果如下
Interface options
******************************
Generic op
3、readlines()方法 (1)语法: readlines()方法用于读取所有行(直到结束符EOF)并返回列表,列表中每个元素为文件中的一行数据,其语法格式如下:
文件对象名.readlines()
(2)快速体验: 使用 readlines()方法读取“testfile.txt”文件。
【参考代码】
with open('testfile.txt','r') as file: #以只读方式打开原有的名为“testfile.txt”的文件
content = file.readlines() #读取所有行并返回列表
print(content) #输出列表
print('*'*60) #输出60个*用于分隔
for temp in content: #遍历列表
print(temp) #输出列表每个元素
【运行结果】 程序运行结果如下:
['Interface options\n', 'Generic options\n', 'Miscellaneous options\n', 'Options you shouldn’t use\n', 'Environment\n', 'variables']
************************************************************
Interface options
Generic options
Miscellaneous options
Options you shouldn’t use
Environment
variables
readlines()方法相当于遍历文件,可以用循环实现:
with open('testfile.txt','r') as file: #以只读方式打开原有的名为“testfile.txt”的文件
for line in file: #遍历文件的所有行
print(line) #输出行
3.文件拷贝
1、描述 文件拷贝即创建文件的副本,此项操作的本质仍是文件的打开、关闭与读写,基本逻辑如下图:
2、快速体验 将文件“testfile.txt“中的内容复制到另一个文件“copy.txt”中。
with open('testfile.txt','r') as file1,open('copy.txt','w') as file2: #打开两个文件
file2.write(file1.read()) #将从“testfile.txt”中读取的内容写入到“copy.txt”中
4.文件定位
1、获取当前文件位置 (1)语法: 在读写文件的过程中,如果想知道当前文件位置指针的位置,可以通过调用tell()方法来获取。tell()方法返回文件的当前位置,即文件位置指针当前位置。其语法格式如下:
文件对象名.tell()
(2)快速体验: 使用 tell()方法获取文件当前的读写位置。
【参考代码】
with open('testfile.txt','r') as file: #以只读方式打开名为“testfile.txt”的文件
line = file.read(8) #读取前8个字节
print(line) #输出前8个字节
p = file.tell() #获取指针当前位置
print('当前位置:',p) #输出当前位置
line = file.read(4) #继续读取4个字节
print(line) #输出读取到的数据
p = file.tell() #获取指针当前位置
print('当前位置:',p) #输出当前位置
【运行结果】 程序运行结果如下:
Interfac
当前位置: 8
e op
当前位置: 12
2、定位到某个位置
(1)语法: 如果在读写文件的过程中,需要从指定的位置开始读写操作,就可以使用seek()方法实现。seek()方法用于移动文件位置指针到指定位置,其语法格式如下图所示。
(2)快速体验: 创建名为“seek.txt”的文件,输入“This is a test!”并存放进文件中,读取单词“test”并输出到终端。
【问题分析】 首先创建并打开指定的文件,文件名由终端输入。然后在文件中写入“This is a test!”字符串,接着利用 seek()方法将文件位置指针指向“test”单词的字母“t”处,最后读取单词“test”并输出到终端。
【参考代码】
filename = input('请输入新建的文件名:') #输入文件名
with open(filename,'w+') as file: #新建文件并以读写方式打开
file.write('This is a test!') #将字符串输入到文件
file.seek(10) #指针移到从头开始的第10个字符处
con = file.read(4) #读取4个字符给con
print(con) #输出
【运行结果】 程序运行结果如下:
请输入新建的文件名:test9.7
15
10
test
【程序说明】 以文本文件格式打开文件时,seek()方法中的whence参数取值只能是0,即只允许从文件开始位置计算偏移量。若想从当前位置或文件末尾位置计算偏移量,需要使用“b”模式(二进制格式)打开文件。
【案例 2】读取“seek.txt”文件中倒数第2个字符。
【参考代码】
with open('seek.txt','rb') as file: #新建文件并以读写方式打开
file.seek(-2,2) #将文件位置指针定位到倒数第2个字符处
con = file.read(1) #读取1个字符给con
print(con) #输出
【运行结果】 程序运行结果如下:
13
b't'
文件夹操作
1.与文件操作有关的模块
OS模块
os.path模块
注:getatime()、getctime()和getmtime()方法分别用于获取文件的最近访问时间,创建时间和修改时间。不过返回值是浮点型秒数,可用time模块的gmtime()或localtime()方法换算。
shutil模块
2.案例--文本词频统计
统计《三国演义》中人物出场次数。
【参考代码】
import jieba #导入jieba库
import os
os.chdir("D:\课程\python\Python\资源包\Python代码\第9章")
with open("三国演义.txt", "r")as file:
txt =file.read() #打开文件并读取文件内容
words = jieba.lcut(txt) #进行分词,将结果放入words列表中
counts = {} #定义字典用于存储词语和计数器
for word in words: #遍历words
if len(word) == 1: #排除单个字符的分词结果
continue
else:
counts[word] = counts.get(word,0) + 1 #计数器累加
items = list(counts.items()) #将字典元素转换为列表
items.sort(key=lambda x:x[1], reverse=True) #排序
for i in range(15): #输出前15项
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))
【程序说明】 jieba是Python中一个重要的第三方中文分词函数库。
由于jieba库是第三方库,不是Python安装包自带的,因此,需要通过pip指令进行安装,pip安装命令如下:
pip3 install jieba 安装完成后,可调用库中的lcut()函数进行分词例如: >>>import jieba >>>jieba.lcut('我们正在努力学习Python语言')
>>>['我们', '正在', '努力学习', 'Python', '语言']
文件格式
1. JSON文件读写
1、什么是JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。多用于Web应用程序来进行数据交换,文件后缀是.json。
2、数据转换对照
3、json文件读写
Python读写json文件使用如下表所示函数,首先需要导入模块json。
写入json的内容只能是dict类型,如:
with open("res.json", 'w', encoding='utf-8') as fw:
json.dump(json_str, fw, indent=4, ensure_ascii=False)
同理,从json中读取到的数据也是dict类型,如:
with open("res.json", 'r', encoding='utf-8') as fw:
injson = json.load(fw)
print(type(injson)) #返回<class 'dict'>
2 .csv文件读写
1、csv文件格式
(1)csv是逗号或其它符号分隔的文件格式,可以用电脑中自带的记事本或者Excel打开;
(2)csv文件以纯文本形式存储表格数据。纯文本意味该文件就是一个字符序列,没有必须二进制数字那样被解读的数据;
(3)csv文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符;
(4)通常,所有记录都有完全相同的字段序列。建议使用WORDPAD或Excel开启,另存新档后,选择csv格式。