之前学的所有内容,都是程序内部运行,没有将数据存储到硬盘上。在实际应用中,最多的是从硬盘上读取数据,或者保存数据。本章就来学习下如何在Python中操作文件。
P 1、文件打开
计算机中的文件通常是按照特定编码格式组织的数据,大多以文件后缀方式来区分格式。如:txt、jpg等。它们在硬盘上按照一定的编码方式进行写入、读取操作。在Python可以用open()函数打开文件,如下:
file = open('hi.txt')print(file)# 输出 <_io.TextIOWrapper name='hi.txt' mode='r' encoding='cp936'>
可以看到,该文件名为hi.txt,模式为读取,编码方式为cp936。open()函数使用方法如下:
其中,
filename:文件名(根据需要带路径)
mode:读取模式。默认为只读
encoding:文件编码方式,默认即可。常用的有gbk、utf-8
buffering:缓冲区,每次读取文件的大小,防止内存溢出。默认为-1,表示一次全部读取
指导手册给出的文件打开模式,如下:
字符 | 含意 |
'r' | 读取(默认) |
'w' | 写入,并先截断文件 |
'x' | 排它性创建,如果文件已存在则失败 |
'a' | 打开文件用于写入,如果文件存在则在末尾追加 |
'b' | 二进制模式 |
't' | 文本模式(默认) |
'+' | 打开用于更新(读取与写入) |
运行目录下有一个文件hi.txt,内容如下:
你好,我是来自仙界的哪吒。你好,我是花果山水帘洞齐天大圣孙悟空。口嗨中......打架中......
打开文件,并显示内容,如下:
file = open('hi.txt',encoding='utf-8')print(file.read())# 输出: 你好,我是来自仙界的哪吒。你好,我是花果山水帘洞齐天大圣孙悟空。口嗨中......打架中......
可以看到,内容一次性全部输出了,通常我们要处理数据,这不是我们想要的。我们希望按行输出。做如下修改:
file.readline()# 输出:你好,我是来自仙界的哪吒。\n
这里用readline()方法实现按行读取,换行符'\n'也一同读取出来。当然也可以用readlines()方法读取所有数据,并以列表形式呈现。如何知道当前文件指针的位置,可以使用tell()方法。
用seek()方法可以调整文件指针位置。但需要注意,为了后续的读取,应确保指针位置指向字符的开始,否则报错。如下:
file.seek(6)# 输出 6file.readline()# 输出,我是来自仙界的哪吒。\n
假设指针调整到5,则出现报错,如下;
print(file.tell())# 输出:5# 再次读取 file.readline()# 输出: Traceback (mostrecent call last): File "<pyshell#15>", line 1,in <module> file.readline() File "<frozen codecs>", line322, in decodeUnicodeDecodeError:'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte
这主要是因为seek()方法的位置是按照字节算的,而一个中文字符会占用3个字节(不同的系统有差异,也可能是2个或其他),这就导致5位置无法识别数据而报错。
现在,我们用close()方法关闭文件,尝试向文件写入数据。同样是上述的hi.txt文件,但需要用写入模式打开。
file = open('hi.txt',encoding='utf-8',mode='w')
执行上述命令后,发现hi.txt文件为空。这是因为"w"模式是新建写模式,如果目标文件存在新文件将覆盖原文件。现在,我们向文件写入数据,并关闭文件,如下:
file.write('hello world.\n')file.close()
在再此打开文件,发现其内容如下:
上述文件处理中,每次都要关闭文件,操作很麻烦。在Python可以利用with上下文管理器实现文件自动关闭处理。如下:
with open('hi.txt',encoding='utf-8',mode='a+') as f: f.write('hello world.\n')
在再此打开文件,发现其内容如下:
hello world.\nhello world.\n
这次只写入1行数据,但文件内容有两行。这是因为本次的文件打开模式是'a+',也就是追加模式。它会打开源文件,并将指针调整到文件最后。而不是新建文件来覆盖原文件。P 3、小结
open()方法可以打开一个文件,并返回文件对象。文件对象具有如下方法:
1、read()方法用于读取文件所有内容;
2、readline()方法用于按行读取文件内容,且换行符作为独立字符存在,不会自动删除;
3、readlines()方法用于读取所有行,并返回列表;
4、tell()用于说明当前文件指针位置,注意按字节计算的哦;
5、seek()用于调整文件指针的位置。
6、close()用于关闭文件。
7、write()用于写入数据。
with上下文管理器可以自动管理文件关闭操作,省去了手动关闭文件的麻烦。(后续专门做一期上下文管理器的文章,此处不赘述)
-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。