python编程:从入门到实践学习笔记-文件和异常

从文件中读取数据

读取文件、文件路径

#pi_digits.txt
3.1415926535
   8979323846
   2643383279

#file_reader.py
fillename = 'pi_digits.txt'

#读取整个文件
with open(filename) as file_object:
    contents = file_object.read()
    print(contents.rstrip())

#逐行读取
with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

运行结果:
3.1415926535
   8979323846
   2643383279
3.1415926535
   8979323846
   2643383279

函数open():接受要打开文件的文件名作为参数。如果没有指定路径,则在当前执行的文件所在的目录中查找指定的文件。此函数返回一个表示文件的对象。
关键字with:表示在不需要访问文件之后将其关闭。
函数read():用于从文件读取指定的字节数,如果未给定或为负则读取所有。到达文件末尾时返回一个空字符串(空行)。打印时可使用函数rstrip()删掉。
相对文件路径:相对于当前运行的程序所在目录。
绝对文件路径:完整的文件路径。

创建包含文件各行内容的列表并使用
使用关键字with时,open()返回的文件对象只在with代码块内使用。如果要在with代码块外访问文件内容,可在里边将文件各行存储在一个列表中待后续使用。

filename = 'pi_30_digits.txt'

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

pi_string = ''

for line in lines:
    pi_string += line.strip()

print(pi_string)
print(len(pi_string))

运行结果:3.141592653589793238462643383279
32

注意:读取文本文件时,python将其中所有文本都解读稳字符串。

写入文件

将文本写入文件时,调用open()时需要提供另外一个实参。其中,第一个实参时要打开的文件的名称。第二个实参是指定的模式:读取模式('r')、写入模式('w')、附加模式('a')、读取和写入模式('r+'。如果省略将以默认的只读模式打开文件。
如果写入的文件不存在,则open()会自动创建它。如果以写入模式打开文件且指定文件对象存在,则返回文件对象前会清空改文件。

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

运行结果:
programming.txt
I love programming.I love programming.
I love creating new games.

注意:python只能将字符串写入文本文件。函数write()不会在写入的文本末尾添加换行符。

附加到文件
如果要写入文件并不覆盖,可以使用附加模式。写入的行都会添加到文件末尾。指定文件不存在时,自动创建。

filename = 'programming.txt'

with open(filename, 'a') as file_object:
    file_object.write("I also love finding meaning in large datasets.\n")
    file_object.write("I love creating apps that can run in a browser.\n")

运行结果:
programming.txt
I love programming.I love programming.
I love creating new games.
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.

异常

异常时python用来管理程序执行期间发生错误的特殊对象。
异常是使用try-except代码块处理的。如果try代码块中的代码运行无误,则跳过except代码块;如果try代码块中的代码运行出现错误,则运行except代码块

print(5/0)

运行结果:
Traceback (most recent call last):
    File "division.py", line 1, in <module>
        print(5/0)
ZeroDivisionError: division by zero

ZeroDivisionError是一个异常对象。

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

运行结果:
You can't divide by zero!

使用try-except代码块也可以隐藏Traceback,防止恶意攻击等等。
除了try-except代码块还有try-except-else代码块。其中try代码块只包含可能导致错误的代码,而依赖于其成功执行的代码都放在else代码块中。
如果希望发生错误时继续运行,可以在except代码块中使用pass语句pass语句还充当了占位符,用来提醒我们在程序的某个地方什么都没有做。

存储数据

模块json可以让我们将简单的python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。并且还可以使用json在python程序中分享数据。

函数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)

运行结果:
numbers.json
[2, 3, 5, 7, 11, 13]

函数json.load()加载存储在指定文件对象的信息。

import json
filename = 'numbers.json'

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

运行结果:
[2, 3, 5, 7, 11, 13]

下面将存取数据和异常结合一下程序运行时,从文件获取用户名,若文件不存在,则提示输入用户名并存储:

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 + "!")

运行结果:
#如果文件不存在
What is your name? Eric
We'll remember you when you come back, Eric!

#如果文件存在
Welcome back, Eric!

猜你喜欢

转载自blog.csdn.net/qq_40925239/article/details/83720138