Python之文件相关操作

文件打开与关闭

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格式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酥酥_2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值