美文网首页
python基础8-文件和异常

python基础8-文件和异常

作者: 牧_青 | 来源:发表于2023-05-08 11:29 被阅读0次

8.1、从文件中读取数据

要使用文本文件中的信息,首先需要将信息读取到内存中,为此,可以选择一次行读取文件的全部内容,也可以以每次一行的方式逐步读取。

8.1.1、读取整个文件

要以任何方式使用文件,都要先打开文,这样才能访问。

open()接受一个参数,表示要打开文件的文件名

with在不再需要访问文件后将其关闭

在这个例子中,没有使用close()来关闭文件,但是可以调用open()和close()来打开和关闭文件,但是如果这样做的话,如果程序存在bug,导致close()语句未执行,文件将不会关闭,未妥善关闭文件会导致数据丢失或受损。

通过这种结构,可以让Python去决定什么时候讲文件关闭

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)

输出结果会多一个空行,因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行,可以在print语句中使用rstrip()来消除空行

8.1.2、文件路径

python只会在文件夹中找,而不会在其子文件夹中查找,因此要让python打开不与程序文件位于同一个目录中的文件,需要提供文件路径。

  • linux中使用斜杠/
  • windows中使用反斜杠\

8.1.3、逐行读取

读取文件是,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以某种方式修改文件中的文本。

每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符,可在Print语句中使用rstrip()函数来消除换行符

filename = 'pi_digits.txt'

with open(filename) as file_object:
    for line in file_object:
        print(line)

8.1.4、创建一个包含文件各行内容的列表

使用关键字with是,open()返回的文件对象只能在with代码块中使用。如果要在with代码外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表

ef read_file_on_line(filename):
    with open(filename) as file_object:
        lines = file_object.readlines()

    for line in lines:
        print(line.rstrip())


filename = 'pi_digits.txt'
read_file_on_line(filename)

8.1.5、使用文件的内容

将文件读取到内存中后,就可以以任何方式使用这些数据了。

python将文本内容都解读为字符串,如果读取的是数字,需要使用int()或者float()函数将其转换为浮点数

filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ""
for line in lines:
    pi_string += line.rstrip()

print(pi_string)
print(len(pi_string))

8.1.6、包含一百万位的大型文件

在文件中有大量数据时,可以使用列表截取的方式来读取随机位置的有限位文本

filename = 'pi_digits.txt'

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ""
for line in lines:
    pi_string += line.rstrip()

print(pi_string[:52] + "...")
print(len(pi_string))

8.2、写入文件

8.2.1、写入空文件

需要将文本写入文件,在调用open()时需要提供另一个实参,表示要往打开的文件中写入文本数据。

在这个实例中,调用open()时,提供了两个实参,第一个是打开文件的名称,第二个实参表示要以写入模式打开这个文件。

打开文件有以下几种模式:

  • 读取模式 'r' (默认只读取)
  • 写入模式 'w'
  • 附加模式 'a'
  • 读取和写入文件 'r+'
filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

8.2.2、写入多行

函数write不会在写入的文本末尾添加换行符,所以如果需要写入多行的话,注意使用'\n'换行符来换行

像显示到终端的输出一样,还可以使用空格,制表符和空行来设置这些输出的格式

def write_file(filename, str):
    # write back to file

    with open(filename, 'w') as file_object:
        file_object.write(str)


str = 'I love programming.\n'
str += 'I love creating new games.\n'
write_file('programming.txt', str)

8.2.3、在文件中追加内容

如果要在文件末尾添加内容,而非覆盖原有的内容,可以使用附加模式打开文件,这种模式下,python不会在返回文件对象前清空文件,而将新写入的内容都追加到文件末尾。

def write_file(filename, str):
    # write back to file

    with open(filename, 'a') as file_object:
        file_object.write(str)


str = 'I love programming.\n'
str += 'I love creating new games.\n'
write_file('programming.txt', str)

8.3、异常

python使用异常的特殊对象来管理程序执行期间发生的错误,当出现错误时,python会创建一个异常对象。如果在程序中对异常对象进行处理,则程序会继续运行,否在程序将停止,并显示一个traceback,其中包含有关异常的报告。

异常是使用try-except代码块处理的。

8.3.1、处理ZeroDivisionErro异常

除法运算,除数如果是0,就会报该错误

try:
  print(5/0)
expect ZeroDivisionError:
  print("You can`t divide by zero!")

8.3.2、使用异常避免崩溃

print("Give me two numbers, and I`ll divide them.")
print("Enter 'q' to quit.")

while True:
    first_number = input("\nFirst number:\n")
    if first_number == 'q':
        break

    second_number = input("\nSecond number:\n")
    if second_number == 'q':
        break

    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print("You can`t divide by zero\n")
        continue

    print(answer)

8.3.3、else代码块

执行错误的情况放在try-except代码块中,将依赖于try代码块成功执行的代码应放到else中。代码流程如下:

  1. python尝试执行try中的代码,只有可能引发异常的代码才放到try代码块中
  2. 如果运行异常,则看异常的类型是否包含在except中,如果是,则执行except代码块中代码
  3. 如果运行正常,则执行else中代码
print("Give me two numbers, and I`ll divide them.")
print("Enter 'q' to quit.")

while True:
    first_number = input("\nFirst number:\n")
    if first_number == 'q':
        break

    second_number = input("\nSecond number:\n")
    if second_number == 'q':
        break

    try:
        answer = int(first_number) / int(second_number)
    except ZeroDivisionError:
        print("You can`t divide by zero\n")
        continue
    else:
        print(answer)

8.3.4、处理FileNotFoundError异常

FileNotFoundError异常通常是由于找不到文件所引起的

filename = 'alice.txt'

try:
    with open(filename) as file_obj:
        contents = file_obj.read()
except FileNotFoundError:
    msg = 'Sorry, the file ' + filename + " does not exist."
    print(msg)

8.3.5、分析文本

分析包含整本书的文本内容

split()方法根据字符串创建一个单词列表,使用该方法一空格为分隔符将字符串拆分为多个部分,并将这部分存储到一个列表中。

filename = 'atom.txt'

try:
    with open(filename) as file_obj:
        contents = file_obj.read()
except FileNotFoundError:
    msg = 'Sorry, the file ' + filename + ' does not exist.'
    print(msg)
else:
    words = contents.split()
    num_words = len(words)
    print("The file " + filename + " has about " + str(num_words) + " words.")

8.4、存储数据

程序把客户提供的信息存储在列表和字典等数据结构中,当用户关闭程序是,需要保存这些信息,可以使用模块json来存储数据

8.4.1、json.dump()和json.load()

使用json.dump()将数据存储在文件中,使用json.load()将文件内容读取到内存中

Json.dump()有两个参数:

  • 要存储的数据
  • 可用于存储数据的文件对象
import json

numbers = [2, 3, 4, 5, 8, 21]

filename = 'numbers.json'
with open(filename, 'w') as file_obj:
    json.dump(numbers, file_obj)

    
with open(filename) as file_obj:
    numbers = json.load(file_obj)

print(numbers)

8.4.2、保存和读取用户生成的数据

对于用户生成的数据,使用json保存他们大有裨益。

import json

filename = 'username.json'


def save_user_name(filename):
    username = input("what`s your name?")

    with open(filename, 'w') as file_obj:
        json.dump(username, file_obj)
        print("we`ll remember you when you come back, " + username + "!")


def greet_user(filename):
    with open(filename) as file_obj:
        username = json.load(file_obj)
        print("hello, " + username)


save_user_name(filename)
greet_user(filename)

8.4.3、重构

代码可以正确地运行,但是可做进一步的改进——将代码划分为一系列完成具体工作的函数,这样的过程被称为重构。重构让代码更清晰,更易于理解,更容易扩展

相关文章

  • Python基础 - json文件和异常捕获

    知识回顾 1.容器类型 列表:[元素];可变的,有序;任意类型;增删改查字典:{键值对};可变的,无序;key不可...

  • Python基础学习【9】-文件和异常

    学习处理文件和保存数据可让你的程序使用起来更容易,学习处理异常可帮助你应对文件不存在的情况,以及其他可能导致程序崩...

  • python文件和异常

    10.1.3 逐步读取 读取文件时,常常需要检查其中的每一行,要以每次一行的方式检查文件,可对文件对象使用for循...

  • Python——文件和异常

    从文件中读取数据 使用文本文件中的信息,首先需要将信息读取到内存中。可以选择一次性读取文件的全部内容,也可以选择逐...

  • Python:文件和异常

    从文件中读取数据 读取整个文件 函数open()接受一个文件名作为参数,将文件内容存储在as后面指定的对象中。使用...

  • Python文件和异常

    文件读取 写入文件 异常处理 存储数据的实例 1、从文件中读取数据 file_reader.py open() 打...

  • Python 基础语法入门

    主要介绍python基础语法 条件判断 循环 函数 类 文件读写 异常Python 数据类型如不熟请参考 Pyt...

  • Python-异常处理

    文件作用:学习Python基础-抛异常(try:except:---不终止程序运行;raise-终止程序运行) #...

  • Python 基础总结(十)(文件和异常处理)

    原文链接 文件处理 1.打开文件 使用如下语法:fileVariable = open(filename, mod...

  • Python基础入门6_文件和异常

    Python 基础入门前五篇: Python 基础入门--简介和环境配置 Python基础入门_2基础语法和变量类...

网友评论

      本文标题:python基础8-文件和异常

      本文链接:https://www.haomeiwen.com/subject/jnjqsdtx.html