python读写取文件和处理异常

 一、读文件

pi_digits.txt内容如下:

  • 使用关键字with在不再需要访问文件后将其关闭,让Python负责妥善地打开和关闭文件。
  • read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。
  • 要删除多出来的空行,可在print 语句中使用rstrip()

1,读取文件

运行如下代码:

print("--------------- 读取文件-------------------")
with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)
    print('rstrip:', contents.rstrip())

输出如下:

 

第一个print输出了Line One和一个空行,第二个print使用了rstrip(),没有输出空行。


2,逐行读取

  • 根据上文,每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print 语句。
print("--------------- 逐行读取-------------------")
with open('pi_digits.txt') as file_object:
    for line in file_object:
        print(line)

输出如下: 

Line One和abc中间有三个换行符:

第一行:Line One 的末尾都有一个换行符,print有一个换行符

第二行:末尾有一个换行符,print有一个换行符


 3,逐行读取,存储在列表

  • readlines() 从文件中读取每一行,并将其存储在一个列表中
print("--------------- 使用文件的内容-------------------")

with open('pi_digits.txt') as file_object:
    lines = file_object.readlines()
pi_string = ''
for line in lines:
    pi_string += line.rstrip()
print(pi_string)
print(len(pi_string))

 输出如下:


二、写入文件

  • ('r')读模式,必须先打开文件。
  • ('r+' )读写模式,需要先打开一个已有的文件。
  • ('w' )写模式,打开文件,如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
  • ('w+' )写读模式,同'w',但可以读。
  • ('a')追加模式,打开时清空原文档,光标自动定位到文档末尾,只写,不可读。
  • ('a+')追加写读模式,由于光标在末尾,此时进行读取的内容为空,需要移动光标位置。
  • 如果你要写入的文件不存在,函数open() 将自动创建它。
print("--------------- 写入文件-------------------")
with open('programming.txt', 'w') as file_object:
    file_object.write('i love programming.\n')
    file_object.write('l love creating new games.\n')

文件内容如下: 

 追加写入:

# 要给文件添加内容,而不是覆盖原有的内容,可以附加模式 打开文件
with open('programming.txt', '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')

 文件内容如下:

 


三、异常处理

语法:try...except...else...,在try中处理事务,except中抛出异常,让程序继续运行。

1、处理 ZeroDivisionError 异常

两数相除,除数不能为0,运行以下代码:

print("--------------- 异常处理-------------------")

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 0!")
    else:
        print(answer)

运行如下:

 当除数为0,输出You can't divide by 0!,否则输出商。

2,处理 FileNotFoundError 异常

filename = 'aaa.txt'
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.")

输出如下:

 换成pi_digits.txt:

 3,异常时什么都不做:pass

可在代码块中使用pass 语句来让Python 什么都不要做。

分别输出pi_digits.txt、aaa.txt和programming.txt有几个单词,文件不存在直接跳过:

import json

def count_words(filename):
    """计算文件单词数目"""
    try:
        with open(filename) as f_obj:
            contents = f_obj.read()
    except FileNotFoundError:
        pass
    else:
        words = contents.split()
        num_words = len(words)
        print("The file " + filename + " has about " + str(num_words) +
              " words.")

filenames = ['pi_digits.txt', 'aaa.txt', 'programming.txt']
for filename in filenames:
    count_words(filename)

输出如下:


四、应用

        读取username.json,如果有,则读取用户名,否则,让用户输入用户名并保存,下次免登录。

import json
def greet_user():
    """问候用户"""
    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 + "!")


greet_user()

运行如下:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值