文章目录

  • 学习教材
  • 第十章 文件和异常
    • 1、从文件中读取数据
    • 写入文件
    • 附加到文件
    • 处理 ZeroDivisionError 异常
    • 处理 FileNotFoundError 异常
    • 分析文本
    • 失败时一声不吭--pass
    • 使用模块json来存储数据
    • 保存和读取用户生成的数据

学习教材

第十章 文件和异常

1、从文件中读取数据

下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行。保存为yzl.txt
与程序放在同一个目录下

在test.py中写

with open('yzl.txt') as file_object:con=file_object.read()print(con)

在这个程序中,第1行代码with open('yzl.txt') as file_object:
函数open()接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。在这个示例中,当前运行的是test.py,因此Python在test.py所在的目录中查找yzl.txt。
函数open()返回一个表示文件的对象。在这里,open('yzl.txt')返回一个表示文件yzl.txt的对象;Python将这个对象存储在我们将在后面使用的变量中。
关键字with在不再需要访问文件后将其关闭。

在这个程序中,注意到我们调用了open(),但没有调用close();你也可以调用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close(),你会发现需要使用文件时它已关闭(无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。

有了表示yzl.txt的文件对象后,我们使用方法read()读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量con中。这样,通过打印con的值,就可将这个文本文件的全部内容显示出来:

输出结果:
3.1415926535
8979323846
2643383279

相比于原始文件,该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因为read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print语句中使用rstrip():
print(con.rstrip())
前面说过,Python方法rstrip()删除(剥除)字符串末尾的空白。现在,输出与原始文件的内容完全相同
文件路径
另外,如果你学过其他的语言,那么到这里你应该有经验了,我们刚才的程序,传给open的是文件名,所以只能在当前执行文件的目录下查找,如果我们想要读取的文件在别的地方,那么我们可以传给open绝对路径。
注意,在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/:在Linux和OS X中使用):

with open('D:\yzl.txt') as file_object:con=file_object.read()print(con.rstrip())

逐行读取
要以每次一行的方式检查文件,可对文件对象使用for循环

with open('D:\yzl.txt') as file:for line in file:print(line)

输出结果

我们发现,空白行更多了。为何会出现这些空白行呢?因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句。要消除这些多余的空白行,可在print语句中使用rstrip():
print(line.rstrip())

输出结果:
3.1415926535
8979323846
2643383279

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

filename='D:\yzl.txt'
with open(filename) as file:lines=file.readlines()for line in lines:print(line.rstrip())

方法readlines()从文件中读取每一行,并将其存储在一个列表中;接下来,该列表被存储到变量lines中;在with代码块外,我们依然可以使用这个变量
处理和使用我们读取到的数据

#读取文件中的数据
filename='D:\yzl.txt'
with open(filename) as file:lines=file.readlines()
#将读取的数据 去除换行 存入字符串pi
pi=''
for line in lines:pi+=line.strip()
#打印字符串pi
print(len(pi))
print(pi)

输出结果:
32
3.141592653589793238462643383279

ps:读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转换为浮点数。
处理大型文件
如果你学过C语言,那么就会了解一个难题,那就是大数问题,由于数据类型的限制,太大的数字我们存不下,即使存为字符串,也是有上限的,只能存数据类型对应范围内的字符串。
而python呢,刚才我们分析的都是一个只有三行的文本文件,但这些代码示例也可处理大得多的文件。
如果我们有一个文本文件,其中包含精确到小数点后1 000 000位而不是30位的圆周率值,也可创建一个包含所有这些数字的字符串。为此,我们无需对前面的程序做任何修改,只需将这个文件传递给它即可。
对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,你想处理多少数据都可以。
即使是面对一百万位圆周率的文件,你也可以用普通的方法去处理他,如下:

#读入一个包含了前一百万位圆周率的文件
filename='D:\yzl.txt'
with open(filename) as file:lines=file.readlines()pi=''
for line in lines:pi+=line.strip()#判断你的生日是否出现在前一百万位圆周率里面
birthday='1204'
if birthday in pi:print('yes')
else:print('no')

写入文件

要将文本写入文件,你在调用open()时需要提供另一个实参w,告诉Python你要写入打开的文件

fileName='D:\yzl.txt'
with open(fileName,'w') as file:file.write('I love you')

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

注意:Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。

如果你想为文件写入多行,需要在write中加入换行符号

fileName='D:\holly.txt'   #指定文件若不存在 会自动创建
with open(fileName,'w') as file:file.write('I love you\n')file.write('And you ?\n')

附加到文件

如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件。你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。
为刚才的文件附加一句话

fileName='D:\holly.txt'
with open(fileName,'a') as file:file.write('Yes,I do')

输出结果:

处理 ZeroDivisionError 异常

我们都知道不能将一个数字除以0。所以你如果用python进行这样的操作,你将看到一个traceback:

Traceback (most recent call last):
File “division.py”, line 1, in < module >
print(5/0)
ZeroDivisionError: division by zero

在上述traceback中,处指出的错误ZeroDivisionError是一个异常对象。Python无法按你的要求做时,就会创建这种对象。在这种情况下,Python将停止运行程序,并指出引发了哪种异常,而我们可根据这些信息对程序进行修改。

使用 try-except 代码块
编写一个try-except代码块来处理可能引发的异常

a=int(input())
b=int(input())
try:ans=a/b
except ZeroDivisionError:print("you can't divide by zero!")
else:    #若为引发异常 则进行else代码print(ans)

输出结果:
5
0
you can’t divide by zero!
2
3
0.6666666666666666

我们将导致错误的代码行print(5/0)放在了一个try代码块中。如果try代码块中的代码运行起来没有问题,Python将跳过except代码块;如果try代码块中的代码导致了错误,Python将查找这样的except代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。
在这个示例中,try代码块中的代码引发了ZeroDivisionError异常,因此Python指出了该如何解决问题的except代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而不是traceback
依赖于try代码块成功执行的代码都应放到else代码块中,这样当出现异常的时候,说明try中代码没有成功,那么后边的也不可以执行。

处理 FileNotFoundError 异常

使用文件时,一种常见的问题是找不到文件:你要查找的文件可能在其他地方、文件名可能不正确或者这个文件根本就不存在。
对于所有这些情形,都可使用try-except代码块以直观的方式进行处理。
我们来尝试读取一个不存在的文件。在只读模式下,并不会为你自动创建文件

fileName='alice.txt'
with open(fileName) as file:file.read()

输出结果:FileNotFoundError: [Errno 2] No such file or directory: ‘alice.txt’

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

输出结果:Sorry, the file alice.txt does not exist.

分析文本

你可以分析包含整本书的文本文件。
split()方法
方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表,虽然有些单词可能包含标点。

txt="and don't peep into"
a=txt.split()
print(a)

输出结果:
[‘and’, “don’t”, ‘peep’, ‘into’]

我找了一段英文文本,存在了test.txt文件中,我们写一个函数,来分析他有多少个单词
代码如下

def count_words(filename):try:with open(filename) as file:con=file.read()except FileNotFoundError:msg = "Sorry, the file " + filename + " does not exist."print(msg)else:words=con.split()num_words=len(words)print("The file " + filename + " has about "+str(num_words)+" words")filename='D:/test.txt'
count_words(filename)

输出结果:
The file D:/test.txt has about 221 words

这里我们把处理文本的代码封装成了一个函数,还写了异常处理办法,这样做有一个好处,就是可以让我们批量分析文本文件
我们把文件路径存入一个列表,用一个for循环来批量处理

filenames=['D:/test.txt','alice.txt','user.txt']
for filename in filenames:count_words(filename)

输出结果:
The file D:/test.txt has about 221 words
Sorry, the file alice.txt does not exist.
Sorry, the file user.txt does not exist.

即使后两个路径不存在,程序也不会崩溃,不影响处理下边的文件

失败时一声不吭–pass

有时候你希望程序在发生异常时一声不吭,就像什么都没有发生一样继续运行。要让程序在失败时一声不吭,可像通常那样编写try代码块,但在except代码块中明确地告诉Python什么都不要做。Python有一个pass语句,可在代码块中使用它来让Python什么都不要做

def count_words(filename):try:with open(filename) as file:con=file.read()except FileNotFoundError:pass   #失败时一声不吭else:words=con.split()num_words=len(words)print("The file " + filename + " has about "+str(num_words)+" words")filenames=['D:/test.txt','alice.txt','D:/test.txt']
for filename in filenames:count_words(filename)

输出结果:
The file D:/test.txt has about 221 words
The file D:/test.txt has about 221 words

中间那个文件路径'alice.txt'不存在,发生了异常,但是程序并未给出任何提示
pass语句还充当了占位符,它提醒你在程序的某个地方什么都没有做,并且以后也许要在这里做些什么。

使用模块json来存储数据

模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json在Python程序之间分享数据。更重要的是,JSON数据格式并非Python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。
使用 json.dump()
函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。

import json
nums=[2,3,4,5,6,7,8]
filename='num.json'
with open(filename,'w') as file:json.dump(nums,file)

执行完了以后,我们打开num.json文件查看内容

使用 json.load()
刚才我们用json.dump存储了那个列表,现在我们打开他

import jsonfilename='num.json'
#以只读方式打开刚才的文件
with open(filename) as file:nums=json.load(file)
print(nums)

我们确保读取的是前面写入的文件。这次我们以读取方式打开这个文件。我们使用函数json.load()加载存储在numbers.json中的信息,
并将其存储到变量numbers中。最后,我们打印恢复的数字列表。

[2, 3, 4, 5, 6, 7, 8]

与刚才存入的一致,这是一种在程序之间共享数据的简单方式。

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

import jsonfilename='username.json'
try:with open(filename) as file:   #如果可以读取用户信息  直接执行elseusername=json.load(file)
except FileNotFoundError:   #读取不到用户信息username=input("What is your name?")  #请用户输入信息  并存储with open(filename,'w') as file:json.dump(username,file)print("We'll remember you when you come back, " + username + "!")
else:print("Welcome back, " + username + "!")

这个程序第一次执行的时候

What is your name?juli
We’ll remember you when you come back, juli!

第二次运行的时候

Welcome back, juli!

python学习(六)----文件和异常相关推荐

  1. [Python学习日记] 文件与文件系统(一)

    [Python学习日记] 文件与文件系统(一) 目录 Python3 File(文件) 方法 open() 方法 file 对象 目录 Python3 File(文件) 方法 open() 方法 Py ...

  2. Python入门(13)——文件和异常

    在开发中经常要对数据进行持久化操作,实现数据持久化最直接的方式就是将数据保存到文件中.在 Python 中实现文件的读写操作非常简单,通过 Python 内置的函数,就可以获得操作文件的对象,从而对文 ...

  3. Android学习——R文件丢失异常原因汇总

    Console报错:R.java was modified manually! Reverting to generated version! 引言: R文件丢失异常在java开发中是个比较常见的异常 ...

  4. python学习之文件处理

    Table of Contents 图片成批resize 多个文件夹中某文件,都保存到另一文件夹中 多个文件夹中某文件,都保存到另一文件夹中,并重命名 多个文件夹中,1/4数据用做测试集,其它用作训练 ...

  5. python 实验九 文件与异常

    1.新建一个文本文件yzy.txt,文件内容如下 慈母手中线,游子身上衣. 临行密密缝,意恐迟迟归. 谁言寸草心,报得三春晖. 编写程序输出该文件的内容,要求使用一次性读入整个文件内容和逐行读取文件内 ...

  6. python 文件操作不被打断_python学习六文件操作和异常处理

    1.文件的定义和类型 什么是文件呢? 文件是数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是存储的一种 文件有哪些类型呢? 本质上所有文件以二进制储存,不过又可以分为文本文件和二进制文件 ...

  7. Python学习六:面向对象编程(上)

    文章目录 前言 一.面向对象编程: 1. oop [object oriented programming] 是一种python的编程思路 2. 解释 3. 面向对象 和面向对象编程 二.类和对象 1 ...

  8. Python知识点8——文件与异常

    读文件 1.一次读取全部文件 def readfile1(filename):with open(filename) as fileobject:contents=fileobject.read()p ...

  9. python基础(文件、异常、模块、类、对象)

    文件: 打开文件使用open函数,open()的第一个参数是:要打开文件的路径,如果只传入文件名那么将在当前文件下查找文件并打开.第二个参数是:文件的打开模式,其他参数都是默认的.文件的打开模式如下图 ...

  10. Python基础:文件和异常

    写入文件 要将文本写入文件,你在调用open()时需要提供两个实参: 第一个实参是文件的名称,可以是相对路径(Python基于当前执行的.py文件所在的目录),也可以是绝对路径(不用多说),在Linu ...

最新文章

  1. numpy append
  2. C++类的基本概念演示Win32版
  3. html页面光标坐标值,javascript-在包含HTML内容的contentEditable区域中获取插入符(光标)的位置...
  4. 中断/gic代码导读:在哪里配置安全中断的?
  5. Navicat Error 2003 - can't connect to mysql server 'localhost' (10061)
  6. Python附带了大量的库 - 初学者如何学起
  7. 求众数leetcode(169)+投票算法
  8. nginx启动vue_nginx下部署vue项目的方法步骤
  9. JPSE问题诊断指导四——hprof
  10. TapTap 发布开发者服务:降低开发者研运成本 聚焦创作优质内容
  11. android华为隐藏底部虚拟按键,沉浸式状态栏/华为虚拟按键隐藏
  12. AutoCAD 样条曲线如何结束
  13. seewo一键投屏在mac电脑上的使用方法
  14. Google VP8 Code 首次深入技术分析 1
  15. 搜索:搜索+优先队列
  16. GD32上FAL Flash分区驱动移植及Easyflash与FlashDB移植说明
  17. 那些有意思的网站(1)
  18. bogomips 骁龙820_中兴这款骁龙820手机堪称经典,如今跌幅近千元
  19. cd linux自带系统安装,Windows 7+CDLinux+Ubuntu 10.04全硬盘安装
  20. ios android 一键换机,‎App Store 上的“手机搬家 - 一键换机助手”

热门文章

  1. CentOS 6.6安装配置LAMP服务器(Apache+PHP5+MySQL)
  2. AC日记——单词倒排 1.7 28
  3. 你实现团队管理了吗?
  4. session是什么,存储在哪里
  5. myeclipse2015添加tomcat
  6. 从一个小Demo看React的diff算法
  7. 004-Python内置数据结构-七种数据结构一览
  8. android中使用setVideoURI()播放视频
  9. 转:requirejs2.0新特性介绍
  10. Windows 7 SP1意味着XP降级的结束