Python 100 ---DAY 11 文件和异常

目录

引言

读写文本文件

读写二进制文件

读写JSON文件

练习


引言

    为什么要引入文件?     为了实现数据持久化,实现数据的持久化最直接简单的方式就是将数据存在文件中。(文件系统)具体在python中可以使用open()函数(python自带)


读写文本文件
 

#最基本的读写文件的方式
def main():
    f = open('asdf.txt', 'r', encoding = 'ansi')  #读
    print(f.read())
    f.close()
    with open('a.txt', 'a', encoding='ansi') as f:  #写
        f.write('Hello, World!')
        f.close()



#根据不同的错误输出具体的异常状况
#使用finally来释放获取的外部资源
#为什么一定要释放外部资源?
#个人认为是为速度,内存等方面
def main1():
    f = None
    try:
        f = open('asdf.txt', 'r', encoding = 'ansi')
        print(f.read())
    except FileNotFoundError:
        print('没有找到指定文件。')
    except LookupError:
        print('指定了未知代码。')
    except UnicodeDecodeError:
        print('读取文件时解码错误。')
    finally:
        if f:
            f.close()


#使用with来释放外部资源
#with关键字会在离开上下文环境是自动释放文件资源
def main2():
    try:
        with open('asdssf.txt', 'r', encoding = 'ansi') as f:
            print(f.read())
    except FileNotFoundError:
        print('没有找到指定文件。')
    except LookupError:
        print('指定了未知代码。')
    except UnicodeDecodeError:
        print('读取文件时解码错误。')

if __name__ == '__main__':
    main2()
#采用不同的方式读取文件中的内容
import time

def main():
    #一次性读取整个文件内容
    with open('asdf.txt', 'r', encoding = 'ansi') as f:
        print(f.read())
    print()


    #使用for-in来循环逐行读取
    with open('asdf.txt', mode = 'r') as f:
        for line in f:
            print(line, end = '')
            time.sleep(0.5)
    print()

    #读取文件按行读取到列表中
    print()
    with open('asdf.txt') as f:
        lines = f.readlines()
    print(lines)

if __name__ == '__main__':
    main()


读写二进制文件
 

#读写二进制文件
#复制图片
def main():
    try:
        with open('ball.png', 'rb') as fs1:
            data = fs1.read()
            #print(type(data))
            #print(data)
        with open('吉多.jpg', 'wb') as fs2:
            fs2.write(data)

    except FileNotFoundError as e:
            print('指定的文件无法打开。')
    except IOError as e:
            print('读写文件时出现错误.')
    print('程序执行结束。')

if __name__ == '__main__':
    main()


读写JSON文件
 

#以json格式保存一个字典中的信息
import json

def main():
    mydict = {
            'name':'Anna',
            'age':20,
            'QQ':145223666,
            'frends':['Button', 'Curd'],
            'cars':[{'brand':'BYD', 'max_speed':180},
                    {'brand':'B', 'max_speed':200},
                    {'brand':'D', 'max_speed':80}
                    ]
    }
    try:
        with open('data.json', 'w', encoding = 'utf-8') as f:
            json.dump(mydict, f)
    except IOError as e:
        print(e)
    print('保存数据完成!')

if __name__ == '__main__':
    main()

练习

  1. 将1~10000的素数分别写入三个文本文件
  2. 输出50句经典电影台词(利用天行数据)

1.

#在文件中输入1~10000的素数
from math import sqrt

#判断是不是素数
def is_prime(n):
    assert n > 0
    for factor in range(2, int(sqrt(n)) + 1):
        if n % factor == 0:
            return False

    return True if n != 1 else False

def main():
    filenames = ('a.txt','b.txt','c.txt')
    fs_list = []
    try:
        for filename in filenames:
            fs_list.append(open(filename, 'w', encoding = 'ansi'))
        for number in range(1,10000):
            if is_prime(number):
                if number < 100:
                    fs_list[0].write(str(number) + '\n')
                elif number < 1000:
                    fs_list[1].write(str(number) + '\n')
                else:
                    fs_list[2].write(str(number) + '\n')
    except IOError as ex:
        print(ex)
        print('写文件时发生错误')
    finally:
        for fs in fs_list:
            fs.close()
    print('操作完成!')

if __name__ == '__main__':
    main()

2.

#利用天行数据中经典台词输出50句经典台词
#注意url地址的问题
import requests
import json

#捕捉并输出一个句经典台词
#其中在url中要将key和相关参数补充完成,不是只有一个网址就可以
def main():
    resp = requests.get('http://api.tianapi.com/txapi/dialogue/index?key=be1037a76c11bcbeae98858e081c4360')
    data_modal = resp.json()['newslist']
    #print(data_modal)  #输出整体的数据结构和其中的内容
    for juzi in data_modal:
        print(juzi['dialogue'])


if __name__ == '__main__':
    for _ in range(50):
        main()
        print()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值