python学习科普--文件、异常、单元测试

python学习科普--文件、异常、单元测试

一、文件

  •  

     

    目录结构如下图:

    微信截图_20200226113755.png

  • 打开文件参数解析:
    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    file: 必需,文件路径(相对或者绝对路径)。
    mode: 可选,文件打开模式
    buffering: 设置缓冲
    encoding: 一般使用utf8
    errors: 报错级别
    newline: 区分换行符
    closefd: 传入的file参数类型
    opener: 暂不清楚

  • 数据输入、输出、存储简单实例

# -*- coding: UTF-8 -*-
import struct
import unittest
import linecache

class TestInput(unittest.TestCase):
    def test_input(self):
        vivid = input("请输入:")
        # 之前Python2是可以使用raw_input的,后面将其整合成了input,其接受任意输入, 将所有输入默认为字符串处理,并返回字符串类型
        print(vivid)

    def test_input_int(self):
        vivid = int(input("请输入:"))
        # 这里给输入内容指定了类型,如果类型不对会报错
        print(vivid)

    def test_input_write(self):
        filename = "write.py"
        vivid = input("请输入:")
        f = open(filename, mode='w', encoding='utf-8')
        w = f.write(vivid)
        print("共写入%d个字节到  %s" % (w, filename))
        f.close()

  • wenjian.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import struct
import unittest
import linecache

class TestFile(unittest.TestCase):
    # 以只读方式打开文件,(mode = 'rb') 一般用于非文本文件如图片等
    # 如果使用:mode = 'rb'  是读取二进制文件,非人工书写的数据如.jpeg等这些。那么读取出来的内容不会换行显示,可以试试
    def test_read_only(self):
        filename = "denglu.py"
        try:
            f = open(filename, mode = 'rb')   # r默认模式,以只读方式打开文件,文件的指针将会放在文件的开头
            print("%s 文件打开成功" % filename)  # 意思是%作为一个替代,将后面的‘filename’字符串替换到%s位置,%s一般是替换字符串
            r = f.read()   # 读取所有内容
            # r = f.readline()  # 读取一行
            # r = linecache.getline(filename, 10)  # 读取文件中的某一行
            print(r)
            f.close() # 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
        except IOError:
            print("文件打开失败,或%s文件不存在" % filename)

    def test_write_read(self):
        filename = "denglu.py"
        try:
            f = open(filename, mode = 'r+', encoding = 'utf-8')   # r+既可以读取还可以写入,不会把原先存在txt中的东西清空
            print("%s 文件打开成功" % filename)  # 意思是%作为一个替代,将后面的‘filename’字符串替换到%s位置,%s一般是替换字符串
            r = f.read()   # 读取所有内容
            print(r)
            w = f.write("\n测试\r哈哈哈")  # \r:换行,光标在上一行;\n:回车,光标在下一行
            print("共写入%d个字节到  %s" % (w, filename))
            f.close() # 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
        except IOError:
            print("文件打开失败,或%s文件不存在" % filename)

    # 打开文件后,写入内容,(mode = 'wb') 一般用于非文本文件如图片等
    # 如果使用:mode = 'wb'  是写入二进制文件,非人工书写的数据如.jpeg等这些。读取如果使用wb就会报错,因为它要以二进制写入
    def test_write_only(self):
        filename = "write.py"
        # 或者:with open("D:\文档管理\联系脚本\write.py", "w") as f:
        try:
            f = open(filename, mode = 'wb')
            # w表示打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
            print("%s 文件打开成功" % filename)   # 意思是%作为一个替代,将后面的‘filename’字符串替换到%s位置,%s一般是替换字符串
            # print(f.read())   # 这里不能使用read读取文件内容,否则会报错
            # w = f.write('write_only\n\rvivid')    # \r:换行,光标在上一行;\n:回车,光标在下一行
            w = f.write(struct.pack('b', 1))    # 以二进制写入
            print("共写入%d个字节到  %s" % (w, filename))   # %d一般是替换数字,%s一般是替换字符串

            f.close()
        except IOError:
            print("文件打开失败,或%s文件不存在" % filename)

    # 打开文件后,读取并写入内容(如果上面的w执行 print(f.read())会报错,因为w不能读取)
    def test_read_write(self):
        filename = "write.py"
        try:
            f = open(filename, mode = 'w+', encoding = 'utf-8')
            # w+表示打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
            print("%s 文件打开成功" % filename)  # 意思是%作为一个替代,将后面的‘filename’字符串替换到%s位置,%s一般是替换字符串
            # r = f.read()   #这里是读取不到任何内容的
            # print(r)
            w = f.write('a = user')
            f.seek(0) # 回到初始位置然后开始读
            # 如果先读的话是读不出任何东西的,因为w+也是纯粹的覆盖写,在未使用写操作前文档是完全空白的,无论之前该文件里有什么。所以只能先写后读。
            print(f.read(w))
            print("共写入%d个字节到  %s" % (w, filename))   # %d一般是替换数字,%s一般是替换字符串

            f.close()
        except IOError:
            print("文件打开失败,或%s文件不存在" % filename)

    # 打开文件后,读取write.py中的文件内容写入到write2.py
    def test_read_and_write(self):
        sourcefilename = "write.py"

        destfilename = "write2.py"

        try:
          fsource = open(sourcefilename, mode = 'r', encoding = 'utf-8')
          print("%s 文件打开成功" % sourcefilename)
          content = fsource.read()
          fsource.close()

          fdest = open(destfilename, mode = 'w', encoding = 'utf-8')
          w = fdest.write(content)   #将上面读取到的write.py文件中的内容写入write2.py文件,并给到变量w
          print("共写入%d个字节到  %s" % (w, destfilename)) # %d一般是替换数字,%s一般是替换字符串

          fdest.close()
        except IOError:
          print("文件打开失败,或文件不存在")

    # 打开文件后,追加内容,(mode = 'ab') 一般用于非文本文件如图片等
    # 如果使用:mode = 'ab'  是读取二进制文件,非人工书写的数据如.jpeg等这些。读取如果使用ab就会报错,因为它要以二进制追加
    def test_append(self):

        filename = "write2.py"
        try:
          f = open(filename, mode='a', encoding='utf-8')
          # 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
          print("%s 文件打开成功" % filename)  # 意思是%作为一个替代,将后面的‘filename’字符串替换到%s位置,%s一般是替换字符串
          # print(f.read())   # 这里不能使用read读取文件内容,否则会报错(暂时没找到其他差别)

          a = f.write('\r\nb = vivid')      # \r:换行,光标在上一行;\n:回车,光标在下一行
          # a = f.write(struct.pack('b', 123))    # 以二进制追加,为啥加进来是个大括号
          print("共写入%d个字节到  %s" % (a, filename))   # %d一般是替换数字,%s一般是替换字符串

          f.close()
        except IOError:
          print("文件打开失败,或%s文件不存在" % filename)

    # 打开文件后,读取并追加内容(如果上面的a执行 print(f.read())会报错,因为a不能读取)
    def test_write_append(self):
        filename = "write2.py"
        try:
            f = open(filename, mode='a+', encoding='utf-8')
            # 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
            print("%s 文件打开成功" % filename)  # 意思是%作为一个替代,将后面的‘filename’字符串替换到%s位置,%s一般是替换字符串
            f.seek(0)
            print(f.read())  # 这里为什么不能打印出读取到的内容

            a = f.write('\r\nb = vivid')  # \r:换行,光标在上一行;\n:回车,光标在下一行
            print("共写入%d个字节到  %s" % (a, filename))  # %d一般是替换数字,%s一般是替换字符串

            f.close()
        except IOError:
            print("文件打开失败,或%s文件不存在" % filename)

if __name__ == '__main__':
  unittest.main()

二、异常:即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

class TestError(unittest.TestCase):
    def test_one(self):
        a = 0
        b = 2
        v =b/a
        print(v)   # 0不能作为被除数,否则会报错。类似于这种语法错误或者其他规则错误,运行时就会报错,也就是异常

    def test_two(self):
        while True:
            try:
                x = int(input("请输入一个数字: "))
                print(x)
                break
            except ValueError:
                print("您输入的不是数字,请再次尝试输入!")   # 为了捕捉到这种异常,我们可以采用try、expect来处理,有异常的时候就输出expect后面的返回
    # 还有很多其他情况我们会遇到不同的报错返回,我们都称为异常,可以通过编写各种条件语句返回不同情况下的异常,根据返回的异常我们可以定位到对应出现问题的
    # 代码位置及其原因,从而节省问题查找时间,提高效率。
if __name__ == '__main__':
  unittest.main()

三、单元测试:

1、单元测试是软件测试的一种类型。顾名思义,单元测试就是测试的对象是程序中的最小单元的测试。程序的最小单元可以是一个函数,一个类,也可以是函数的组合,类的组合。
2、单元测试是软件测试中最低级别的测试活动,与之相对的更高级别的测试有模块测试,集成系统和系统测试等。单元测试一般由软件开发者而不是独立的测试工程师完成。
3、另外,单元测试有一个隐含的性质,那就是单元测试天然就是自动化的,单元测试属于自动化测试。
4、Python单元测试框架有很多,unittest是Python标准库中自带的单元测试框架(unittest有一个很重要的特性:它通过类(class)的方式,将测试用例组织在一起。)
5、 nose是Python的一个第三方单元测试框架。如果要使用nose,需要先显式安装它。与unittest不同的是,nose的测试用例并不限制于类。任何函数和类,
6、只要名称匹配一定的条件(例如,以test开头或以test结尾等),都会被自动识别为测试用例。
7、pytest是Python另一个第三方单元测试库。特点:支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数;自动识别测试模块和测试函数
8、兼容unittest和nose测试集,支持Python3和PyPy3,丰富的插件生态,已有300多个各式各样的插件,和活跃的社区

 

如果大家对于学习Python有任何问题,学习方法,学习路线,如何学习有效率的问题,可以随时来咨询我,或者缺少系统学习资料的,我做这行年头比较久,自认为还是比较有经验的,可以帮助大家提出建设性建议,这是我的Python交流qun:785128166,有任何问题可以随时来咨询我。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值