Python学习(十二)文件操作和异常处理以及使用json存储数据

Python 文件操作和异常处理

Python 文件操作

文件操作步骤
  1. 打开文件,打开方式(读写) open(file_name)

  2. 操作文件(增删改查)

  3. 关闭文件, file_name.close()

    三种基本的操作模式 r(只可读) w(只可写) a(追加)
     流程:
     1 创建文件对象 
     2 调用文件方法进行操作  
     3 关闭文件

读文件


'pi_digits.txt'
3.1415926535
  8979323846
  2643383279

全文读取
#需要读取的文件
filename = 'pi_digits.txt'

#打开读取文件
with open(filename) as file_object:
    lines = file_object.read()
    #尾行多一个空行
    print(lines)
    #删除尾部的空行
    print(lines.rstrip())
#操作完成关闭文件
filename.close()
3.1415926535
  8979323846
  2643383279
逐行读取文件
#需要读取的文件
filename = 'pi_digits.txt'
#打开读取文件
with open(filename) as file_object:
    #删除行每行后面的空行
    for line in file_object:
        print(line.rstrip())
3.1415926535
  8979323846
  2643383279
创建一个包含文件各行内容的列表
#需要读取的文件
filename = 'pi_digits.txt'
#创建一个变量
pi_sing = ''
#打开读取文件
with open(filename) as file_object:
    lines = file_object.readlines()
for line in lines:
    #删除行每行后面的空行
    linea = line.rstrip()
    #删除行每行开头的空行,并拼接到变量
    pi_sing += line.strip()
    print (pi_sing)
    #统计变量长度
    print (len(pi_sing))
    print ('====>>')
3.1415926535
12
====>>
3.14159265358979323846
22
====>>
3.141592653589793238462643383279
32
====>>
百万位的圆周率中搜索是否包含你的生日
#pi_million_digits.txt 百万位的圆周率表
#需要读取的文件
filename = 'pi_million_digits.txt'
#打开读取文件
with open(filename) as file_object:
    lines = file_object.readlines()
#创建一个变量
pi_string = ''
for line in lines:
    #删除行每行开头的空行,并拼接到变量
    pi_string += line.strip()
#输入一个变量
birthday = input("Enter your birthday, in the form mmddyy: ")
#if判断是否纯在内容中
if birthday in pi_string:
    print("Your birthday appears in the first million digits of pi!")
else:
    print("Your birthday does not appear in the first million digits of pi.")
Enter your birthday, in the form mmddyy: 11111111111111111111111111
Your birthday does not appear in the first million digits of pi.

写文件

写入操作方式:

r:读取文件
w:清空写入文件
a:追加写入文件
r+:文件读写模式
写入空文件
#打开空文件并写入内容
with open(filename, 'w') as file_object:
    file_object.write('
I Love programming!')
I Love programming!

追加写入多行内容

##打开空文件并写入内容
 with open(filename, 'a') as file_object:
    #每行添加换行符
    file_object.write("I also love finding meaning in large datasets.
")
    file_object.write("I love creating apps that can run in a browser.
")
I Love programming!
I also love finding meaning in large datasets.
I love creating apps that can run in a browser.

注意:写入多行时注意使用换行符 “ ” 文件打开后光标默认停在文件最后一个字符位

Python 异常处理

  • Python 异常处理:指程序执行过程中各种原因造成的程序中断或挂死。

  • python中使用try_except模块来处理这些意外情况,try_except模块让程序执行指定的操作,同时反馈python发生了什么错误。

  • 使用try_except模块即便异常发生也不会退出程序而是会继续运行,显示你编写的友好错误消息。

处理异常

处理流程:

  1. 获取异常信息类型
  2. 将异常类型添加到try_except模块中判断,避免程序崩溃。

try_except模块的使用使错误页面更友好

异常信息类型获取

#代码
print (5/0)
#报错   
    print (5/0)
ZeroDivisionError: division by zero

报错类型:ZeroDivisionError

将异常类型添加到try_except模块中判断

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

程序正常执行友好提示错误

You can't divide by zero
try_except模块中else代码块

需要在tty代码块中执行成功的代码,在继续运行的需要通过else代码块告诉程序。

tty:判断代码是否会引发错误
except:将错误信息告诉程序
else:将校验后的代码,交由程序运行

代码实例一:

判断是否是输入的整数

判断是否整数除以“0”

python中不允许一个数字除以“0”

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

while True:
    first_number = input("
First 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 0!")
    #可以使用多个except提示错误类型
    except ValueError:
        print("You can'tinvalid literal for int()!")
    else:
        print(answer)
Give me two numbers, and I'll divide them.
Enter 'q' to quit.

First number: 5
Second number: 2
2.5

First number: 0
Second number: 0
You can't divide by 0!

First number: 0.8
Second number: 0
You can'tinvalid literal for int()!

代码实例二:

判断文件是否存在

#文件名称
filename = 'alice.txt'

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

代码实例三:

判断文件是否存在

分析存在的文件中包含了大致多少个单词

def count_words(filename):
    """Count the approximate number of words in a file.分析存在的文件中包含了大致多少个单词"""
    try:
        with open(filename) as f_obj:
            contents = f_obj.read() 
    except FileNotFoundError:
        pass
    else:
        # Count approximate number of words in the file.
        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)
The file alice.txt has about 29461 words.
The file siddhartha.txt has about 42172 words.
The file little_women.txt has about 189079 words.

使用json存储数据

模块json能够将简单的python数据结构转存到文件中,并在程序再次运行时加载该文件中的数据,也可以使用json在python程序之间分享数据。

json数据格式并非python专用

json模块的读写功能

json.dump() 存储数据 json.load() 读取数据

json模块的写功能

import json

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

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

列表numbers被写入numbers.json文件中

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

json模块的读功能

import json

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

读出umbers.json文件中的信息

[2, 3, 5, 7, 11, 13]
使用json保存和读取用户生成的数据和重构

用户生成数据如果不以某种方式保存,当程序停止时会出现数据信息丢失现象。json模块很好的解决了这个问题。

import json

def get_stored_username():
    """Get stored username if available.
    如果存储了用户名,就获取他"""
    filename = 'username.json'
    try:
        with open(filename) as f_obj:
            username = json.load(f_obj)
    except FileNotFoundError:
        return None
    else:
        return username

def get_new_username():
    """Prompt for a new username.
    提示输入用户名"""
    username = input("What is your name? ")
    filename = 'username.json'
    with open(filename, 'w') as f_obj:
        json.dump(username, f_obj)
    return username

def greet_user():
    """Greet the user by name.
    问候用户并指出用户名"""
    username = get_stored_username()
    if username:
        print("Welcome back, " + username + "!")
    else:
        username = get_new_username()
        print("We'll remember you when you come back, " + username + "!")

greet_user()

首次执行代码:

What is your name? yunlei
We'll remember you when you come back, yunlei!

再次执行代码:

Welcome back, yunlei!
原文地址:https://www.cnblogs.com/jorbabe/p/8733875.html