Python基础学习09天

主要内容:

文件处理相关,读取文件和写入文件等。

异常处理和捕获异常。

文件和异常处理

从文件中读取数据

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,我们可以一次性读取文件的 全部内容,也可以以每次一行的方式逐步读取。

读取整个文件

要读取文件,需要一个包含几行文本的文件。新建一个圆周率后30位的文件为例,保存为pi_digits.txt,同时小数点后是为换行。如下:

3.1415926535
  8979323846
  2643383279

读取该文件的Python文件,file_reader.py。代码如下:

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

open()函数是任何方式使用文件,哪怕仅仅是打印其内容,都得先打开文件。它接受一个参数: 要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。

close()函数是关闭文件。

关键字with在不再需要访问文件后将其关闭。Python方法rstrip()删除字符串末尾的空白。

运行结果:

3.1415926535
  8979323846
  2643383279

文件路径

当你将类似pi_digits.txt这样的简单文件名传递给函数open()时,Python将在当前执行的文件 (即.py程序文件)所在的目录中查找文件。

语法格式:

1

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

通过使用绝对路径,可读取系统任何地方的文件。注意区分相对路径和绝对路径。

逐行读取

读取文件时,常常需要检查其中的每一行:你可能要在文件中查找特定的信息,或者要以 某种方式修改文件中的文本。逐行读取可以理解为遍历、循环等逻辑。所以在读取文件时,可以采用for语句来实现。代码示例:

filename = 'pi_digits.txt'

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

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

使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外 访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表:你可以立即处理文件的各个部分,也可推迟到程序后面再处理。

filename = 'pi_digits.txt'

with open(filename) as file_object: 
    lines = file_object.readlines()#从文件中读取每一行,并将其存储在一个列表中
#使用一个简单 的for循环来打印lines中的各行
for line in lines:
    print(line.rstrip())

使用文件的内容

将文件读取到内存中后,就可以以任何方式使用这些数据了。

filename = 'pi_digits.txt'

with open(filename) as file_object: 
    lines = file_object.readlines()#从文件中读取每一行,并将其存储在一个列表中

pi_string = ''       #创建一个变量存贮圆周率的值
for line in lines:   #使用一个循环将各行都加入pi_string,并删除每行末尾的换行符
    pi_string += line.strip()
print(pi_string)     #打印这个字符串
print(len(pi_string)) # 长度

读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并 要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转 换为浮点数。

包含一百万位的大型文件

对于你可处理的数据量,Python没有任何限制;只要系统的内存足够多,想处理多少数据都可以。

写入文件

保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。

写入空文件

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

代码示例:

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")

打开文件时,可指定读取模 式('r')、写入模式('w')、附加模式('a')或让你能够读取和写入文件的模式('r+')。如果 你省略了模式实参,Python将以默认的只读模式打开文件。

以写入(‘w’)模式打开文件时,如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

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

写入多行

函数write()不会在你写入的文本末尾添加换行符,如果需要写入多行就需要在每行的后面添加换行符:\n

filename = 'programming.txt'

with open(filename, 'w') as file_object:
    file_object.write("I love programming.")
    file_object.write("I love Python.")

输入结果:

1

I love programming.I love Python.

附加到文件

附加到文件可以理解为不清空当前的文件内容,在文件内容后面追加即可。如果以附加的形式打开,如果文件不存在就会被创建。具体实现只需要在使用open()函数的时候指定打开方式为a即可,其余类似。

异常

Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知 所措的错误时,它都会创建一个异常对象。

异常是使用try-except代码块处理的。try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except代码块时,即便出现异常,程序也将继续运行: 显示你编写的友好的错误消息,而不是令用户迷惑的traceback

处理ZeroDivisionError异常

例如我们让Python运行8/0的代码报错信息。

>>> 7/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

此时程序停止运行。

使用try-except代码块
try:
     print(7/0) 
except ZeroDivisionError:
    print("You can't divide by zero!")
    # 其他的代码块将继续运行

使用异常避免崩溃

发生错误时,如果程序还有工作没有完成,妥善地处理错误就尤其重要。这种情况经常会出 现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。

else代码块

try-except-else代码块的工作原理:Python尝试执行try代码块中的代码;只有可 能引发异常的代码才需要放在try语句中。

代码示例:

try:
    answer = int(first_number) / int(second_number)
except ZeroDivisionError: 
    print("You can't divide by 0!")
else: 
    print(answer)

处理FileNotFoundError异常

产生的背景:要查找的文件可能在其他地方、文件名可能 不正确或者这个文件根本就不存在。机会产生FileNotFoundError异常。同理可以给用户一个友好的消息提示。

拆分字符串

方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。

代码示例:

>>> title = "Alice in Wonderland" 
>>> title.split()
['Alice', 'in', 'Wonderland']

使用多个文件

使用多个文件和单个文件逻辑一致,只不过把逻辑处理部分封装为方法,多个文件就循环处理即可。

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.")

filename = 'alice.txt' 
count_words(filename)

存储数据

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

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

函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。

编写一个存储一组数字的简短程序,再编写一个将这些数字读取到内存中的程序 (json.load())。

代码示例:

import json

num = [1,2,3,4,5,6]

filename = 'num.json'
with open(filename,'w') as f_obj:
    json.dump(num,f_obj)#写入文件
    num = json.load(f_obj) #读到内存,可以打印
    
print(num)

运行后文件的内容和打印的内容一致。

1

[1, 2, 3, 4, 5, 6]

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

用户输入的信息我们可以通过写入文件的方式写在文件内,再次输入的时候可以打开文件查询判断是否存在。其实就是把写入和读取文件两个逻辑合成一个。

代码如下:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

深入分析Java线程中断机制

在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断。在java中启动线程非常容易...

9320
来自专栏前端布道

MongoDB初识

什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 ...

39480
来自专栏大内老A

ASP.NET Core的配置(3): 将配置绑定为对象[下篇]

我们在《读取配置信息》通过实例的形式演示了如何利用Options模型以依赖注入的方式直接获取由指定配置节绑定生成的Options对象,我们再次回顾一下当初我们编...

21790
来自专栏思考的代码世界

Python编程从入门到实践之文件和异常处理|第12天

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,我们可以一次性读取文件的 全部内容,也可以以每次一行的方式逐步读取。

45470
来自专栏猿人谷

经典C语言面试题

1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int main(void)  {  char buff[10]; ...

99650
来自专栏开源优测

接口测试 | 25 requests + pytest测试实例

概述 本文主要分享如何将pytest和requests结合一起使用,让大家有个初步的了解。 主要内容有: pytest简介 pytest + requests示...

67390
来自专栏玄魂工作室

Python黑帽编程2.6 模块

Python黑帽编程2.6 模块 我们已经学习了如何在你的程序中定义一次函数而重用代码。如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜...

384100
来自专栏数据结构与算法

2991:2011

2991:2011 查看 提交 统计 提问 总时间限制:1000ms内存限制:65536kB描述已知长度最大为200位的正整数n,请求出2011^n的后四位。输...

34270
来自专栏Ryan Miao

java线程(1)--概念基础

参考:http://lavasoft.blog.51cto.com/62575/99150 http://blog.csdn.net/baby_newstar/...

34280
来自专栏指尖下的Android

JNI之路径初探---3

这里讲一下如何拿到类中方法和属性的签名: 1,cmd进入命令行 2,cd 命令切到当前项目的src路径 3,javap -s -p 包名+类名(xxx.x...

10930

扫码关注云+社区

领取腾讯云代金券