Python基础(八) 文件和异常

太过爱你忘了你带给我的痛 2023-10-09 12:32 117阅读 0赞

Python基础(八) 文件和异常

  • 1从文件中读取数据
    • 1.1读取整个文件
    • 1.2逐行读取
    • 1.3创建一个包含文件各行内容的列表
    • 1.4Python可以处理包含一百万位的大型文件,没有任何的限制,只要系统的内存足够多。
  • 2写入文件
    • 2.1写入空文件
    • 2.2附加模式
  • 3异常
  • 4存储数据

本人是个新手,写下博客用于自我复习、自我总结。
如有错误之处,请各位大佬指出。
参考教材:Python编程从入门到实践


1从文件中读取数据

每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以每次以一行的方式逐步读取。

1.1读取整个文件

例如:

  1. with open('pi_digits.txt')as file_object:
  2. contents=file_object.read()
  3. print(contents.strip())

如果想使用文件,肯定首先需要打开文件,这样才能访问它。函数open()接受一个参数:要打开文件的名称。如这个例子,如果这个文件就在当前目录,则可以直接通过文件名调用。如果这个文件在当前目录的子文件夹中,这样的方法就不行。或者有时可能要打开不在程序文件所属目录中的文件。

这样的情况下,当然需要提供文件路径,它让Python到系统的特定位置去查找。这样就可以分为两种情况,相对文件路径和绝对文件路径。

  1. ①相对文件路径:(所需要的文档在当前程序目录的子文件夹中)
  2. 如:with open('text_files\filename.txt')as file_object:
  3. 注:在LinuxOSX中,这里是/↑
  4. ②绝对文件路径:(所需要的文档在其他文件夹中)
  5. 如:file_path='C:\Users\other_files\text_files\filename.txt'
  6. with open(file_path)as file_object:

其中的关键字with在不再需要访问文件后将其关闭。当然,也可以调用open()和close()来打开和关闭文件,但这样很危险,如果未妥善地关闭文件可能会导致数据丢失或受损。

这一切可以让Python去确定:我们只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。

我们使用read()方法,可以读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents中。这样通过打印contents值,就可将这个文本文件的全部内容显示出来。但是read()到达文件末尾时会返回一个空字符串,而将这个空字符串显示出来的时候就是一个空行。要删除末尾的空行,可在print语句中使用strip()

1.2逐行读取

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

例如:

  1. filename='pi_digits.txt'
  2. with open(filename)as file_object:
  3. for line in file_object:
  4. print(line.strip())

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

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

例如;

  1. filename='pi_digits.txt'
  2. with open(filename)as file_object:
  3. lines=file_object.readlines()
  4. for line in lines:
  5. print(line.strip())

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

例如:

  1. filename='pi_digits.txt'
  2. with open(filename)as file_object:
  3. lines=file_object.readlines()
  4. pi_string=''
  5. for line in lines:
  6. pi_string+=line.strip()
  7. print(pi_string)
  8. print(len(pi_string))

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

1.4Python可以处理包含一百万位的大型文件,没有任何的限制,只要系统的内存足够多。

2写入文件

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

2.1写入空文件

例如:

  1. filename='programming.txt'
  2. with open(filename,'w')as file_object:
  3. file_object.write("I love programming.")

要将文本写入文件,当然首先还需要open()。但是需要在其中提供另一个实参,来告诉Python你要写入打开的文件。打开文件时,这个实参可指定:读取模式’r’、写入模式’w’、附加模式’a’或既能读取又能写入的模式’r+’。这个实参可以省略,就像10.1中那样,这样的话Python将以默认的只读模式打开文件。

如果需要写入的文件不存在,函数open()将自动创建它。然而,以写入模式’w’打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件!

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

2.2附加模式

上面提到了一个附加模式’a’,这个附加模式就是,给文件添加内容,而不是覆盖原有的内容。因为’w’模式写入模式会清空之前的文件内容,‘r’只能读取,那么附加只能用’a’!添加的内容都会添加到文件末尾。

比如:

  1. filename='programming.txt'
  2. with open(filename,'a')as file_object:
  3. file_object.write("I love creating apps that can run in a browser.\n")

3异常

Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;否则程序停止,并显示一个traceback,其中包含有关异常的报告。异常用try-except代码块处理,有时还用try-except-else。这样即便出现了异常,程序也将继续运行,显示你编写的友好的错误信息,而不是traceback。这样很关键,因为traceback中会透露一些程序的信息,如果被不怀好意的人利用,他们就可以根据这些信息对程序进行攻击。也就是说,一定要妥善地处理错误。

例如:

  1. print("Give me two numbers, and I'll divide them.")
  2. print("Enter 'q' to quit.")
  3. while True:
  4. first_number=input("\nFirst number:")
  5. if first_number == 'q':
  6. break
  7. second_number=input("Second number:")
  8. try:
  9. answer=int(first_number)/int(second_number)
  10. except ZeroDivisionError:
  11. print("You can't divide by zero!")
  12. else:
  13. print(answer)

通过预测可能发生错误的代码,可编写健壮的程序,从而抵挡恶意的攻击。

4存储数据

很多程序都要求用户输入某种信息,并在用户关闭程序时,保存他们提供的信息;一种简单的方式是使用模块json来存储数据。

例如:

  1. import json
  2. def get_stored_username():
  3. filename='username.json'
  4. try:
  5. with open(filename)as f_obj:
  6. username=json.load(f_obj)
  7. except FileNotFoundError:
  8. return None
  9. else:
  10. return username
  11. def get_new_username():
  12. username=input("What is your name")
  13. filename='username.json'
  14. with open(filename,'w')as f_obj:
  15. json.dump(username,f_obj)
  16. return username
  17. def greet_user():
  18. username=get_stored_username()
  19. if username:
  20. print("Welcome back, "+username+"!")
  21. else:
  22. username=get_new_username()
  23. print("We'll remember you when you come back, "+username+"!")
  24. greet_user()

json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
使用json.load()可以将文件中内容读取到内存中。
上例是重构后的代码。重构就是对代码进行划分,做进一步的改进。重构让代码更清晰、更易于理解、更容易扩展。

发表评论

表情:
评论列表 (有 0 条评论,117人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python--文件异常

    目录 1、读取文件 1.1 读取文件的全部内容 1.2 相对路径和绝对路径 1.3 访问文件中的各行 1.4 使用文件中的内容 1.5 包含100万位的大型文件

    相关 python进阶_警告异常

    心情有点纠结,怎么说呢,倒不是因为其他学习上的事情,反而是因为生活上狗血的剧情逼着人偏离,渐行渐远,人跟人之间有误会也是正常的,可能是因为交流不够,彼此不够了解吧,希望能尽快度