文件,不仅在Python里面的.py,电脑里面大大小小的内容基本上都属于文件。 但是通过使用Python可以实现对计算机里面各种文件进行增删改查的操作。
文件
文件(File)包括快捷方式,各种office文件,软件里面的各种内置文件等等。
I/O的意思是Input/Output,意思是读取/输出。
操作文件的步骤可以概括为: 打开;对文件进行操作;关闭。在Python里面操作也是这样的步骤。
打开文件
open命令可以用来打开文件。
file_name = 'ss'
open(file_name) # 主要要输入的参数只有文件名
不过要注意,如果ss文件没和我的lianxi.py在一个文件夹里面,就会报错。比如我放在文件夹里面的叫bao的包里面,那就要写成:
file_name = 'bao/ss'
open(file_name) # 主要要输入的参数只有文件名
注意,在Windows系统里面分隔文件名用的是反斜杠,Python里面是正斜杠。或者在Python里面用双反斜杠也行。或者在单引号前面加r也行,这样反斜杠就不会被识别为转义字符。
如果有好多上级目录,可以用两个点来表示,有几级写几个就行。
也可以写绝对路径,就写完整根目录开始的路径就行,注意写成正斜杠或者双反斜杠。
读取文件
使用.read()方法进行读取,作用是把文件内容全部保存为一个字符串然后返回。
file_name = 'bao/ss'
wenjian = open(file_name)
print(wenjian.read()) # 注意文本文件只能输入英文
结果即为文本文件里面的内容:
Bleach qian nian xue zhan pian kai bo la
关闭文件
打开文件占用的内存不会随着程序结束而释放,所以文件操作之后的关闭很重要。方法也很简单,就是用.close()方法就可以。
wenjian.close()
当然结果不会有什么显示,主要是进行了关闭文件的操作。这个时候再读取文件就报错了。
有一种方法可以直接避免单独使用close方法,也就是可以避免忘记close关闭文件,那就是with(指令)as(文件名):语句,这个语句可以在执行完毕的时候自动close,而且这个文件只能在这个语句里面使用。
with open(file_name) as wenjian:
print(wenjian.read())
结束后如果再次写出print(wenjian.read()),就会报错。注意,当file_name对应的文件名不存在的时候会报错,可以用try语句进行处理。
try:
with open(file_name) as wenjian:
print(wenjian.read())
except FileNotFoundError:
print(f'没有{file_name}啊')
文件的简单读取
open()函数可以打开两种文件:一种是纯文本文件,但是默认文本是None(encoding=None),也就是没有编码,这种情况下会选择最简单的编码,对于汉语这样的复杂编码,用不了,所以默认情况下只能打开英文的。所以需要改一下encoding才能打开其他的语言的文本。
try:
with open(file_name,encoding='utf-8') as wenjian:
print(wenjian.read())
except FileNotFoundError:
print(f'没有{file_name}啊')
Bleach qian nian xue zhan pian kai bo la 千年血战篇开播啦
另一种是二进制文件,也就是图片、PPT、MP3之类的文件。
对于.read()方法,他的功能是将文本文件所有的内容全部读取,也就是不论文件大小都会全部读取。因此,读取到较大文件的时候,将会导致内存泄漏。也就是不建议用.read()方法读取较大文件。.read()方法里面有一个参数是size,默认值-1,就是读取所有内容,然后直接设置输入几就会读取几个字符,注意是字符,包括空格回车之类的。而且连续调用将会接着上次的位置继续读,也就是说每次多加一个相同语句结果都不一样。剩余字符数小于size的时候就读取剩下所有的。读到没有了就返回空字符串。
try:
with open(file_name,encoding='utf-8') as wenjian:
# print(wenjian.read())
print(wenjian.read(11))
print(wenjian.read(11))
print(wenjian.read(11))
print(wenjian.read(11))
print(wenjian.read(11))
print(wenjian.read(11))
print(wenjian.read(11))
except FileNotFoundError:
print(f'没有{file_name}啊')
Bleach qian
nian xue z
han pian ka
i bo la 千年血
战篇开播啦
下面返回的都是空字符串。
所以,读取大文件应该以一种分批读取的方式,避免内存泄漏,比如上面这种方法。
try:
with open(file_name,encoding='utf-8') as wenjian:
# print(wenjian.read())
c = 10
while True:
r = wenjian.read(c)
if not r: # 如果没有了,返回空串了,说明读取完了
break
print(r,end='') # 取消换行
except FileNotFoundError:
print(f'没有{file_name}啊')
Bleach qian nian xue zhan pian kai bo la 千年血战篇开播啦
这样就达到了读取完整内容但是分批读取的目的和效果了。
readline()方法
.readline()方法的作用是读取一行内容,同理多次引用会接续上一次读到的位置。现在,把文本内容改成:
Bleach qian nian xue zhan pian kai bo la
千年血战篇开播啦
不容易,等了这么长时间
然后输入:
with open(file_name,encoding='utf-8') as wenjian:
print(wenjian.readline())
print(wenjian.readline())
print(wenjian.readline())
得到结果为:
Bleach qian nian xue zhan pian kai bo la
千年血战篇开播啦
不容易,等了这么长时间
另外还有一个.readlines()方法,功能一样,但是区别是会一次性将读取内容封装到一个列表里面然后返回。也就是说返回结果是好几句在一个列表里面用逗号隔开。所以一句指令就可以得到所有行内容。
with open(file_name,encoding='utf-8') as wenjian:
print(wenjian.readlines())
['Bleach qian nian xue zhan pian kai bo la\n', '千年血战篇开播啦\n', '不容易,等了这么长时间\n', '\n']
一句一个元素。所以可以把wenjian.readlines()赋值给一个变量,这样就可以用调用列表元素的方式打印某一行。另外还可以通过变量遍历输出所有行。
with open(file_name,encoding='utf-8') as wenjian:
r = wenjian.readlines()
print(r[1])
千年血战篇开播啦
with open(file_name,encoding='utf-8') as wenjian:
for y in wenjian:
print(y)
Bleach qian nian xue zhan pian kai bo la
千年血战篇开播啦
不容易,等了这么长时间