Python学习笔记(九)——文件与异常

Python的文件操作与C语言中的文件操作很多地方都极为相似,比如各个实参的定义。对于文件使用的步骤。在文件操作前应先打开文件,同时注意及时关闭文件。

一 从文件中读取数据

1.读取整个文件

创建一个txt文件1.txt

3.141592653589793238462643383279

下面的程序将打开并读取这个文件,将其显示在屏幕上;

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

我们利用了函数open()打开了该文件,因为在文件操作前,必须要先打开文件。
关键字with在不再需要访问文件时将其关闭。
打开文件后,我们也可以使用方法read()读取这个文件的全部内容。作为一个字符串存储在contents中

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

如果需要删除多出来的空行,可以使用到rstrip()。

2.文件路径

当我们把简单文件名传递给函数open时,Python将在当前执行的文件所在的目录中查找。
当我们需要寻找其它文件夹的文件时,就可以使用到相对文件路径。它是相对于执行的Python程序的,在windows中通常这么表示:

with open('text_files\filename.txt') as file_object:

我们还可以将文件在计算机中的准确位置告诉 Python ,这样就不用关心当前运行的程序存储在什么地方了。这称为 绝对文件路径
在wendows系统中,它们类似于这样:

file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt'
with open(file_path) as file_object:

3.逐行读取

我们可以使用for循环进行逐行读取。方便查找特定的信息,或者以某种方式修改文件中的文本。

filename = '1.txt'

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

此时我们发现输出的空白行更多了。因为print语句中加上了一个空白行。如果我们需要删除多余的空白行,可以使用语句rstrip()

4.创建一个包含文件各行内容的列表

filename = '1.txt'

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

for line in lines:
    print(line)

方法 readlines() 从文件中读取每一行,并将其存储在一个列表中。接下来我们可以使用for循环把lines列表各个元素读取出来。

5.使用文件的内容

将文件读取到内存后,我们便可以使用任意方式使用这些数据了。可以使用前面的字符串,列表,循环等等操作去使用文件内容

二 写入文件

1.写入空文件

我们在使用open()需要再提供一个实参,以告诉Python我们接下来的操作。

filename = 'a.txt'

with open(filename,'w') as file_object:
    file_object.write("Hello World")

第一个实参也是要打开的文件的名称;第二个实参( ‘w’ )告诉 Python ,我们要以 写入模式 打开这个文件。打开文件时,可指定 读取模式 ( ‘r’ )、 写入模式 ( ‘w’ )、 附加模式 ( ‘a’ )或让你能够读取和写入文件的模式( ‘r+’ )。如果你省略了模式实参, Python 将以默认的只读模式打开文件。
如果我们要写入的文件不存在,函数 open() 将自动创建它。然而,以写入( ‘w’ )模式打开文件时千万要小心,因为如果指定的文件已经存在, Python 将在返回文件对象前清空
该文件。

2.写入多行

函数write()不会在写入的文本末尾添加换行符。所以有时我们需要手动添加\n。

3.附加到文件

我们指定了实参’a’将内容添加到末尾,而不是直接覆盖原来的内容。

三 异常

1.处理ZeroDivisionError异常

print(5/0)

    print(5/0)
ZeroDivisionError: division by zero

此时我们将一个数字除以了0

2.使用try-except代码块

当我们认为发生错误时,可以编写一个try—except来处理可能发生的异常

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

3.使用异常避免崩溃

我们需要程序妥善处理无效输出,并提示用户进行有效输出,这样可以避免程序的崩溃

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

while True:
    first_number = input("\nFirst number: ")
    if first_number == 'q':
        break
    second_number = input("Second number: ")
    if second_number == 'q':
        break
    answer = int(first_number) / int(second_number)
    print(answer)

此时我们发现将0作为被除数时程序将崩溃

4.else代码块

通过将可能引发错误的代码放在 try-except 代码块中,可提高这个程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此我们需要将它放到 try-except 代码块中。这个示例还包含一个 else 代码块;依赖于 try 代码块成功执行的代码都应放到 else 代码块中:

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

while True:
    first_number = input("\nFirst number:")
    if first_number == 'q':
        break
    second_number = input("Second number")
    try:
        answer = int(first_number)/int(second_number)
    except ZeroDivisionError:
        print("You can't divide by zero")
    else:
        print(answer)

5.处理 FileNotFoundError 异常

filename = 'alice.txt'

with open(filename) as f_obj:
    contents = f_obj.read()

此时Python无法读取不存在的异常,此时引发一个异常

Traceback (most recent call last):
File "alice.py", line 3, in <module>
with open(filename) as f_obj:
FileNotFoundError: [Errno 2] No such file or directory: 'alice.txt'

从错误报告可以看出问题出现在open()语句,所以我们需要把open()语句放入try中:

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

6.分析文本

我们使用方法split(),它更具一个字符串创建一个单词列表。我们可以根刺该列表及时单词数量。

7.使用多个文件

def count_words(filename):
    """ 计算一个文件大致包含多少个单词 """
    try:
        with open(filename) as f_obj:
            contents =f_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.")

filenames = ['alice.txt', 'siddhartha.txt', 'moby_dick.txt', 'little_women.txt']
for filename in filenames:
    count_words(filename)

此时的try-except语句可以避免让用户看到 traceback ;让程序能够继续分析能够找到的其他文件。
我们也可以直接使用pass,跳过对错误的描述。

四 存储数据

模块 json 让你能够将简单的 Python 数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用 json 在 Python 程序之间分享数据。更重要的是, JSON 数据
格式并非 Python 专用的,这让你能够将以 JSON 格式存储的数据与使用其他编程语言的人分享。

1.使用json.dump()和json.load()

我们先导入模块 json ,再创建一个数字列表。
函数 json.dump() 接受两个实参:要存储的数据以及可用于存储数据的文件对象。

import json

numbers = [2, 3, 5, 7, 11, 13]

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

下面再编写一个程序,使用json.load()将文件读取到内存中

import json

filename = 'numbers.json'

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

2.保存和读取用户生成的数据

再保存和读取用户的数据时,使用json是一种极为有效的方式。

import json

username = input("What is your name? ")

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

此时,我们输入用户名,并将其存储起来。
我们也可以读取存储的数据

import json

filename = 'username.json'
with open(filename) as f_obj:
    username = json.load(f_obj)
    print("Welcome back, " + username + "!")

我们也可以把这两个程序整合在一起:

import json

#如果以前存储了用户名,就加载它
#   否则,就提示用户输入用户名并存储它
filename = 'username.json'
try:
    with open(filename) as f_obj:
        username = json.load(f_obj)
except FileNotFoundError:
    username = input("What is your name?")
    with open(filename,'w') as f_obj:
        json.dump(username,f_obj)
        print("We'll remember you when you come back" + username +"!")
else:
    print("Welcome back " + username + "!")

3.重构

代码能够正常允许,但我们可以把代码改进——划分为一系列完成具体工作的函数。这样的过程被称为 重构

猜你喜欢

转载自blog.csdn.net/weixin_51871724/article/details/121088758