Python之错误异常和文件处理

python 基础知识 - 文件处理/错误和异常 + 练习题 python 基础+练习 阅读详情
  • 之前的文章介绍的都是Python的一些语法和使用方法, 详情可参考Python基础知识
  • 然而这里我们要说的是编程中我们最不想见到的, 但是却也是不得不面对的Bug
  • 除此之外, 这里还会介绍一下Python中的文件读取

错误和异常

Python 中(至少)有两种错误:语法错误和异常(syntax errors 和 exceptions )

语法错误

语法错误,也被称作解析错误, 使我们在学习Python过程中最常遇到的错误, 来看看下面两个错误示例:

if True
    print('titan')

# 错误信息:
File "../5-读文件.py", line 19
    if True
          ^
SyntaxError: invalid syntax
  • 语法分析器指出错误出现的文件(File)和错误行(line 19)
  • 在检测到错误的位置前面显示一个小“箭头”
  • 错误是由箭头前面的标记引起的(或者至少是这么检测的)
  • 此处错误是因为Print函数的前面, if语句后面少了一个冒号(:)

异常

  • 在没有语法错误的情况下, 当我们执行当前程序的时候也可能会引发错误
  • 运行期检测到的错误称为 异常,并且程序不会无条件的崩溃
  • 异常能够编译通过, 但是不能运行成功; 而语法错误不能编译成功
print(1 / 0)
# 错误信息:
File "../5-读文件.py", line 22, in <module>
    print(1 / 0)
ZeroDivisionError: division by zero


print(1 + "12")
# 错误信息:
File "../5-读文件.py", line 22, in <module>
    print(1 + "12")
TypeError: unsupported operand type(s) for +: 'int' and 'str'


print(1 + ad * 2)
# 错误信息:
File "../5-读文件.py", line 22, in <module>
    print(1 + ad * 2)
NameError: name 'ad' is not defined
  • 错误信息的第一行, 指出了异常出现的文件和错误行
  • 第二行, 提示了是哪一条语句出现了错误
  • 第三行, 指出了是哪一种异常信息;异常也有不同的类型,异常类型做为错误信息的一部分显示出来
  • 以上三种异常分别为: 零除错误(ZeroDivisionError), 类型错误(TypeError) 和 命名错误(NameError)
  • 相关异常信息官方文档

异常处理

  • 我们都知道, 正常情况下, 程序执行过程中遇到错误或者异常, 程序便会中断执行, 这也就以为着后面的程序将无法执行
  • 但是在Python中, 我们可以针对异常做出一些处理, 使之在遇到异常错误时, 继续执行后面的代码
  • 异常类其实是class类, 所有的错误都是继承自BaseException

注意: 还有一些错误是无法跳过的, 比如内存错误

错误处理的语句

第一种格式
# 格式:

try:
    语句t
except 错误码 as e:
    语句1
except 错误码 as e:
    语句2
except 错误码 as e:
    语句3
    ...
except 错误码 as e:
    语句n
else:
    语句e

需要注意的是:

  • 语句中的else是可有可无的
  • except语句中的as e也可以不加
# 错误处理的语句(else可有可无)
try.......except....else

# 格式:
try:
    语句t
except 错误码1:
    语句1
except 错误码2:
    语句2
else:
    语句3
第二种格式

一个 except 子句可以在括号中列出多个异常的名字, 对于指定的一些异常做统一处理

try:
    print(7 / 0)
except (ZeroDivisionError, NameError):
    print('程序异常')
第三种格式

无论遇到的是哪一种异常, 均做统一处理

try:
    print(7 / 0)
except :
    print('程序异常')
try 语句工作方式
  • 首先,执行 try 子句 (在 try 和 except 关键字之间的部分)
  • 如果没有异常发生, except 子句 在 try 语句执行完毕后就被忽略了
  • 如果在 try 子句执行过程中发生了异常,那么该子句其余的部分就会被忽略
  • 如果异常匹配于 except 关键字后面指定的异常类型,就执行对应的except子句。然后继续执行 try 语句之后的代码
  • 如果发生了一个异常,在 except 子句中没有与之匹配的分支,它就会传递到上一级 try 语句中
  • 如果最终仍找不到对应的处理语句,它就成为一个 未处理异常,终止程序运行,显示提示信息
使用示例:

一个 try 语句可能包含多个 except 子句,分别指定处理不同的异常。至多只会有一个分支被执行。异常处理程序只会处理对应的 try 子句中发生的异常,在同一个 try 语句中,其他子句中发生的异常则不作处理

try:
    print(7 / 0)
except ZeroDivisionError:
    print('除数为0')
except NameError:
    print('没有改变量')
except SyntaxError:
    print('不知道')

一个 except 子句可以在括号中列出多个异常的名字

try:
    print(7 / 0)
except (ZeroDivisionError, NameError):
    print('程序异常')

最后一个 except 子句可以省略异常名称,以作为通配符使用。你需要慎用此法,因为它会轻易隐藏一个实际的程序错误!可以使用这种方法打印一条错误信息,然后重新抛出异常(允许调用者处理这个异常):

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

try … except 语句可以带有一个 else子句,该子句只能出现在所有 except 子句之后。当 try 语句没有抛出异常时,需要执行一些代码,可以使用这个子句。例如:

try:
    print(7 / 0)
except ZeroDivisionError:
    print('除数为0')
except NameError:
    print('没有改变量')
else:
    print('代码OK')

抛出异常

raise语句允许程序员强制抛出一个指定的异常

raise NameError('TitanJun')

# 异常信息:
Traceback (most recent call last):
  File "../1-异常处理.py", line 95, in <module>
    raise NameError('TitanJun')
NameError: TitanJun

如果你需要明确一个异常是否抛出,但不想处理它,raise 语句可以让你很简单的重新抛出该异常:

try:
    raise NameError('TitanJun')
except NameError:
    print('NameError错误')
    raise

# 错误信息:
NameError错误
Traceback (most recent call last):
  File "../1-异常处理.py", line 97, in <module>
    raise NameError('TitanJun')
NameError: TitanJun

定义清理行为

  • try 语句还有另一个可选的子句: try--except--finally,目的在于定义在任何情况下都一定要执行的功能
  • 不管有没有发生异常,finally子句 在程序离开 try 后都一定会被执行
  • 当 try 语句中发生了未被 except 捕获的异常(或者它发生在 except 或 else 子句中),在 finally 子句执行完后它会被重新抛出。 - try语句经由 break,continue 或 return 语句退 出也一样会执行 finally 子句
try:
    print(7 / 0)
except ZeroDivisionError:
    print('除数为0')
except NameError:
    print('没有改变量')
finally:
    print('我一定要执行')

# 输出:
除数为0
我一定要执行

预定义清理行为

有些对象定义了标准的清理行为,无论对象操作是否成功,不再需要该对象的时候就会起作用。以下示例尝试打开文件并把内容打印到屏幕上

for line in open("myfile.txt"):
    print(line)

这段代码的问题在于在代码执行完后没有立即关闭打开的文件。这在简单的脚本里没什么,但是大型应用程序就会出问题。with 语句使得文件之类的对象可以 确保总能及时准确地进行清理

with open("myfile.txt") as f:
    for line in f:
        print(line)

语句执行后,文件 f 总会被关闭,即使是在处理文件中的数据时出错也一样。其它对象是否提供了预定义的清理行为要查看它们的文档

文件读写

  • 在Python中文件的读写, 通常以文本打开,这意味着,你从文件读出和向文件写入的字符串会被特定的编码方式(默认是UTF-8)编码。
  • 模式后面的 'b' 以 二进制模式 打开文件:数据会以字节对象的形式读出和写入。
  • 这种模式应该用于所有不包含文本的文件

读取文件

函数 open() 返回文件对象,通常的用法需要两个参数

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

# 使用
path = r'/Users/xxx/text.txt'
file = open(path, 'r')
  • 参数一: 一个含有文件名的字符串
  • 参数二: 描述如何使用该文件的字符串, 默认为 'r'
    • 'r': 时表示只是读取文件
    • 'rb': 以二进制形式打开一个文件用于只读, 文件描述放在文件的开头
    • 'w': 表示只是写入文件(已经存在的同名文件将被删掉)
    • 'wb': 打开一个文件用于写入二进制, 如果该文件已经存在会覆盖, 如果不存在则创建新文件
    • 'w+': 打开一个文件用于读写
    • 'a': 表示打开文件进行追加,写入到文件中的任何数据将自动添加到末尾
    • 'r+': 表示打开文件进行读取和写入
    • 'b': 以 二进制模式 打开文件

文件对象方法

read()
  • 要读取文件内容,需要调用 file.read(size),该方法读取若干数量的数据并以字符串形式返回其内容
  • size 是可选的数值,指定字符串长度, 如果没有指定 size 或者指定为负数,就会读取并返回整个文件。
  • 当文件大小为当前机器内存两倍时,就会产生问题。反之,会尽可能按比较大的 size 读取和返回数据。
  • 如果到了文件末尾,file.read()会返回一个空字符串
# 读取文件
str = file.read()
print(str)
readline()
  • file.readline() 从文件中读取单独一行,字符串结尾会自动加上一个换行符(\n),只有当文件最后一行没有以换行符结尾时,这一操作才会被忽略。
  • 这样返回值就不会有混淆,如果 file.readline() 返回一个空字符串,那就表示到达了文件末尾,如果是一个空行,就会描述为 '\n',一个只包含换行符的字符串
file.readline()
遍历文件对象

可以循环遍历文件对象来读取文件中的每一行。这是一种内存高效、快速,并且代码简介的方式

for line in file:
    print(line)

如果你想把文件中的所有行读到一个列表中,你也可以使用 `list(file)` 或者 `file.readlines()`

# 把文件读到列表中
print(list(file))
print(file.readlines())
写入文件
  • write: 将 string 的内容写入文件,并返回写入字符的长度
  • writelines: 用于向文件中写入一序列的字符串, 没有返回值
# 写入文件
leng = file.write('我是一只小鸭子')
print(leng)
# 输出: 7


# 写入一个序列
file.writelines(['hello', 'Python'])

想要写入其他非字符串内容,首先要将它转换为字符串

tell/seek
  • tell: 返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文件开头到指针处的比特数。
  • 需要改变文件对象指针话话,使用 file.seek(offset,from_what)。
  • 指针在该操作中从指定的引用位置移动 offset 比特,引用位置由 from_what 参数指定。
  • from_what 值为 0 表示自文件起始处开始,1 表示自当前文件指针位置开始,2 表示自文件末尾开始。
  • from_what 可以忽略,其默认值为零,此时从文件头开始
l = file.readline()
print(l)

pos = file.tell()
print(pos)

# 输出:
b'https://www.titanjun.top/\n'
26

重新设置文件读取指针到开头

file.seek(5, 0)
print(file.readline())

# 输出:
b'https://www.titanjun.top/\n'
b'://www.titanjun.top/\n'
close
  • 当你使用完一个文件时,调用 file.close() 方法就可以关闭它并释放其占用的所有系统资源。
  • 在调用 file.close() 方法后,试图再次使用文件对象将会自动失败
file.close()

file.read()

File "../5-读文件.py", line 64, in <module>
    file.read()
ValueError: read of closed file
关键字with
  • 用关键字 with 处理文件对象是个好习惯。
  • 它的先进之处在于文件用完后会自动关闭,就算发生异常也没关系。
  • 它是 try-finally 块的简写
with open(path, 'rb+') as file:
    str = file.read()
    print(str)
file.close()
Python 入门编程课系列:Python文件操作与异常处理:处理外部资源和错误情况 1.背景介绍 在过去的几年里,由于互联网的蓬勃发展,人们越来越多地从事信息化、数据处理、分析等领域。数据的获取、加工、存储、传输和分析,成为各个行业、企业、组织面临的一项重要任务。其中,数据处理过程中的一个重要环节就是文件的读取、写入及其操作。Python提供了许多内置的模块和函数可以用来处理文件。本文将对Python的文件读写操作进行进一步深入探讨, 阅读详情

相关推荐

IDEA集成selenium自动化测试(Java+Selenuim+testNG+Maven)

文章目录写在前面01 | 新建Maven项目02 | idea集成Selenium03 | 写在前面 因为软件测试的需求和博主比较经常使用Java,于是,想在Idea中集成selenuim,用Java编写测试代码,因此有了这篇文章来记录一下过程。 资源指路: java使用selenium实现模拟浏览器操作API大全 模拟登录 TestNG入门教程 感谢上面博客的大佬。 01 | 新建Maven项目 不使用骨架创建,直接点击左侧Maven,然后一路next即可。 02 | idea集成Sele

aLinxi的博客 8279

python 文件拷贝

import os def file_copy(src, des): # 打开源文件 file_r = open(src, 'rb') # 这里使用rb能够拷贝二进制文件 # 打开要拷贝进的文件 file_w = open(des, 'wb') while True: # 读取内容 content = file_r.read(1024) # 判断是否读取完 if content == b'':

啥都不会 1788

本体(Ontology)概述

认识本体        本体(Ontology)的概念源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体可以在语义层次上描述知识,可以看成描述某个学科领域知识的一个通用概念模型。德国学者Studer在1998年给出了本体的相关定义“本体是共享概念模型的形式化规范说明”。这个定义包含了四层含义:即共享(share)...

baijinswpu的博客 7万+

Django下载文件--打开文件后需要主动关闭文件吗

因此,引发一个问题的思考,如果文件比较大,会不会因为被打开了,而没有关闭,占用内存呢?然后在return response之前,使用f.close()关闭了文件。开始调试发现,文件已经被关闭,不能正常return response。为了让文件正常返回,不对文件进行主动关闭,发现可以下载成功。今天在写文件下载接口的时候,使用django的。然后重启django后,重新调用下载文件接口。后端处理卡住的时候,重新查看文件的占用情况。确定文件被占用,截图如下。此时,文件并没有被打开。重新查看文件的占用情况。

qq_39619888的博客 912

弘玑RPA进阶攻略

01.弘玑RPA产品概要。02.设计器的安装与卸载。03.设计器特性与使用。

长安诗社社长@-梁瀚文- https://github.com/HevnChin https://gitee.com/HevnChin 3641

PLUS模型土地利用变化模拟使用简介

因子包括自然因子如社会因子,通过计算整理得到新图层,并以tif文件输出到驱动因子的文件夹里,驱动因子文件夹里存放的是tif文件格式。线性回归使用提供的所有的LULC资源数据,可以选择往后预测的年数,选择好数据之后,可以得出预测的每一年的每一用地类型面积数据。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。

qq_42831270的博客 5806

django下载文件异常 - ValueError: read of closed file

# 下载缓慢 def django_download_slowly(s_path, s_name): with open(s_path, "rb") as p_file: p_response = FileResponse(p_file.read()) p_response["Content-Type"] = "application/octet-stream" p_response["Content-Disposition"] = f"attach.

ksx_120999的博客 3494

使用podman 容器化安装DIFY

本文阐述了使用podman容器化安装DIFY的过程

wengad的博客 1901

fdata = fp.read()ValueError: read of closed file 什么意思

这个错误提示 ValueError: read of closed file。要避免这个错误,可以确保在文件关闭之前读取文件,或者使用。或者文件对象自动关闭),再尝试读取就会触发这个错误。语句块结束时自动关闭,避免了手动关闭的潜在问题。在 Python 中,当你打开一个文件后,语句来自动管理文件的打开和关闭。如果你关闭了文件(例如使用。

weixin_44638453的博客 330

手把手教你如何在应用宝的Android模拟器安装第三方应用方法

通过上述步骤,你就能在腾讯应用宝模拟器中安装并运行本地的第三方APK应用了。虽然稍显繁琐,但操作起来并不复杂,只要按照步骤一步步做,就能顺利完成。希望这篇文章能帮助到遇到类似问题的你!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7208

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【项目模块依赖构建顺序规划】

某公司正在开发一个大型软件系统,系统包含 N 个模块,每个模块之间存在构建依赖关系。例如,模块 A 可能依赖于模块 B,这意味着必须先构建模块 B,才能构建模块 A。 请根据依赖关系,输出所有可能的模块构建顺序(按照构建顺序排列模块名称),要求:

MISAYAONE的博客 404

python负数错误异常类型_Python之错误异常和文件处理

之前的文章介绍的都是Python的一些语法和使用方法, 详情可参考Python基础知识然而这里我们要说的是编程中我们最不想见到的, 但是却也是不得不面对的Bug除此之外, 这里还会介绍一下Python中的文件读取错误和异常Python 中(至少)有两种错误:语法错误和异常(syntax errors 和 exceptions )语法错误语法错误,也被称作解析错误, 使我们在学习Python过程中最...

weixin_39779530的博客 536

中国工商银行企业架构建设实践最全总结

中国工商银行参考IBM持续价值创新方法并吸收TOGAF等主流企业架构的框架理念,结合业务实际情况形成工行自己的企业架构方法论并实践,为数字化转型提供支撑。本案例通过介绍中国工商银行企业架构之业务架构设计方法,为其他银行企业架构建设提供参考。 企业架构是数字化转型的抓手,可以帮助企业规划、管理和实施数字化解决方案,以实现业务目标并适应不断变化的市场条件。中国工商银行通过战略目标指导业务架构的规划和设计,业务架构建模后指导IT架构建模。

银行信息系统应用架构详解 2730

如何在Python中处理二进制文件中的错误和异常

使用块来捕获和处理可能发生的异常。捕获特定类型的异常以提供有针对性的处理逻辑。使用更通用的异常类型(如Exception)来捕获所有未预料的错误,但要小心使用以避免隐藏重要信息。添加额外的逻辑来检测和处理二进制数据读取时可能遇到的问题。考虑将错误信息记录到日志文件中,并设计恢复策略以应对错误情况。

2301_78096295的博客 669

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python文件操作与异常处理_Python文件操作及错误和异常处理

前面几篇文章介绍了Python的基本语法、函数和模块以及Python面向对象编程,这些知识对于大部分的日常的编程问题已经足够了,但对于经常需要分析大数据如基因组的人来说还是不够的。本章将介绍Python的文件操作以及错误处理与调试。文件读写用python做数据分析不能总是临时创建一些数据集,更多的时候我们要分析从其它地方获得的数据,必输生信领域最多的就是测序数据,因此第一步就需要将数据读入到Pyt...

weixin_39925813的博客 313

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python获取文件路径错误处理_python路径和异常处理

一、路径处理路径处理:os.path.dirname : 获取文件/文件夹 所在的目录os.path.join: 路径拼接的方法os.path.abspath: 获取绝对路径__file__ : 在哪个文件里面,打印的就是哪个文件的文件名1、os.path.dirname : 获取文件/文件夹 所在的目录importos#1、os.path.dirname : 获取文件/文件夹 所在的目录f...

weixin_39628384的博客 2080

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

错误和异常处理+python文件读写+枚举类

一 错误和异常 1.概念 错误:语法错误【解析错误】,例如:缩进,缺少冒号等 异常:当程序运行的时候【可能性】 问题:当程序中遇到异常,程序会终止在异常处,后面的代码没有执行的机会 解决:跳过异常,让后面的代码继续执行【屏蔽异常】 2.常见的异常 AttributeError:试图访问一个对象没有的成员【属性和方法】 ValueError:值错误,传入了一个不期望的值 ImportError...

兄弟我先抛块砖,有玉的尽管砸过来 581

《Python入门+Python爬虫》——3Day Python基础——python文件操作、错误与异常处理

《Python入门+Python爬虫》——3Day Python基础——python文件操作、错误与异常处理

LYG优快云_的博客 351

python学习(二)之文件处理与错误异常

文件的输出与输出: open打开方式: 打开方式区别: 另: sys 模块通过 sys.argv 属性提供了对命令行参数的访问; sys.argv 是命令行参数的列表, len(sys.argv)是命令行参数的个数(也就是 argc); 错误与异常 try-except; try+多个except; finally子句

北方的雪之博客专栏 850

[学习笔记]Head First Python 第3章 文件与异常 处理错误

# 第3章 文件与异常 import os os.getcwd() # 当前的工作目录 print(os.getcwd()) os.chdir('D:/Users/ccool/PycharmProjects/Head_First_Python/hfpy') # 切换目录 # 加载数据############################# data = open('sketch.t...

qq_43605847的博客 175

Python学习:文件读写和异常处理_python中打开、读取、写入或者关闭文件的过程中遇到错误,你的程序应该能捕获异常,

由于finally块的代码不论程序正常还是异常都会执行,甚至是调用了sys模块的exit函数终止Python程序,finally块中的代码仍然会被执行(因为exit函数的本质是引发了SystemExit异常),因此我们把finally代码块称为“总是执行代码块”,它最适合用来做释放外部资源的操作。例如在函数中,当函数的执行条件不满足时,可以使用抛出异常的方式来告知调用者问题的所在,而调用者可以通过捕获处理异常来使得代码从异常中恢复,定义异常和抛出异常的代码如下所示。为了让代码具有健壮性和容错性,我们可以。

2501_90403950的博客 681

【Python】使用一个循环来简化重复的代码块,并使用异常处理来处理复制文件可能的错误情况。

它会尝试复制文件,如果失败,会等待一段时间后再次尝试,最多重试指定的次数。如果仍然失败,会给出相应的错误信息。函数,传递源文件路径和目标文件路径即可。它会自动进行复制操作并处理错误情况。使用一个循环来简化重复的代码块,并使用异常处理来处理复制文件可能的错误情况。接受源文件路径、目标文件路径,以及可选的。在这个简化的代码中,你只需要调用。

Good_Hope的博客 454

Python学习:文件读写和异常处理_python中打开、读取、写入或者关闭文件的过程中遇到错误,你的程序应该能捕获异常,(1)

下图展示了如何根据程序的需要来设置open函数的操作模式。在使用open函数时,如果打开的文件是字符文件(文本文件),可以通过encoding参数来指定读写文件使用的字符编码。如果对字符编码和字符集这些概念不了解,可以看看《字符集和字符编码》一文,此处不再进行赘述。如果没有指定该参数,则使用系统默认的编码作为读写文件的编码。当前系统默认的编码可以通过下面的代码获得。使用open函数打开文件成功后会返回一个文件对象,通过这个对象,我们就可以实现对文件的读写操作;

2401_84281720的博客 1088

python3读写文件错误_python3基础11异常处理|文件读取|文件写入

详细介绍python异常处理方法:try/except/else/finally/raise/assertpython文件读写:open/write目录1.异常处理处理单个异常:try/except多个异常一种方式处理:元组包含多个异常类型多个异常各自特异处理:多个except语句处理所有异常:Exception 捕获所有异常脚本执行之后做清理工作:finally没有触发异常的时候执行一些任务:t...

weixin_39559895的博客 577
上一篇: Python的面向对象和正则表达式
下一篇: Python中模块的使用
CodeTitan
博客等级 码龄9年 51粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值