从0.1开始学Python——[29]

文件,不仅在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

千年血战篇开播啦

不容易,等了这么长时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值