Python学习笔记(5)文件&异常

Chapter 10

注:学习时我使用的是MacOS。

文件1

  • 读取整个文件
    例子
#pi_digits.txt

3.1415926535
  8979323846
  2643383279
#test.py
with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)

注意:
1. with关键词 。经由Python的自动判断,可以在程序不再需要访问文件的时候,关闭文件,避免数据丢失或者受损。如果没有with关键词,只有open(),则应该在后续不需要访问文件的地方,加上close(),但是我们通常无法准确判断这个地方在哪里。因此,使用with是最妥善的选择。
2. open(文件名字符串)打开文件,这是使用文件必要的操作。括号里的字符串为文件名,包含后缀。Python将在当前终端所在的目录中,查找该文件,并打开。如果所运行的程序和文件并不在同一文件夹下,则需提供文件路径,让Python到特定的位置去找。
Mac OS中的例子如下(Windows中,斜杠为反斜杠\,而且绝对路径左侧反斜杠前面,还要说明是哪一个盘):


#绝对路径

with open('/Users/xxxxxx/Desktop/pi_digits.txt') as file_object:


#相对路径

with open('code/pi_digits.txt') as file_object:

#该相对路径指的是,当前终端所在文件夹中,有一个code文件夹,文件就在这个文件夹中。注意,绝对路径在书写的时候,不加左侧的斜杠。
  1. read()读取文件的全部内容。
  • 逐行读取
    上面的例子,使用read()来一次性读取文件的全部。当我们需要逐行读取文件的时候,应该使用for循环。
file_name = 'pi_digits.txt'
with open(file_name) as file_object:
    for line in file_object:
        print(line)

上面的代码,读取结果是

3.1415926535

  8979323846

  2643383279

发现,行与行之间多出一行空行。这是因为,pi_digits.txt文件中,每一行的末尾有一个隐形的换行符\n,而两个print()之间也会自动换行。为解决这一状况,可以用.rstrip()进行处理。
另外,上面的程序,将表示文件路径的字符串,用一个变量代替。这是可行的。

  • 使用with时,open()返回的对象,只能在with代码块中使用。为了能在其他部分使用,可以将读取的各行内容,存在一个列表中。.readlines()函数可以做到这一点。其从文件中读取每一行,并返回一个存有每一行的列表。
file_name = 'pi_digits.txt'
with open(file_name) as file_objective:
    lines = file_object.readlines()

for line in lines:
    print(line.rstrip())

上面的代码,最终效果和read()的效果相同。

  • 在读取文本文件时,Python会将所有文本都理解为字符串。如果要使用其中的数字,应当用int()float()将其转换为整数或浮点数。

  • 对于字符串strstr[int_1, int_2]表示仅仅输出第int_1 <= x < int_2个字符,即截取其中的一部分。这样看来,字符串似乎也是一个列表,其中每一个元素都是一个字符。按照这个想法,容易知道,str1 in str2也是可行的,当str2中包含str1,它为True,否则为False

  • 字符串.replace(str_1, str_2)方法,可以将字符串中所有的str_1暂时替换为str_2。注意,只是暂时变化,类似于.strip()。一旦字符串后面没有它,就会恢复。

  • 写文件
    例子

file_name = 'txt/try.txt'
with open(file_name, 'a') as file_object:
    file_object.write('I am Xiaomi Jiandan.\n')
    file_object.write('I am a student.\n')

注意:
1. open(file_name, 'a')这里,open()有两个参数,前者是文件名,后者是要说明打开文件的方式。这里介绍以下几种。
r读取模式,若不存在该文件会报错,而后只能读取。如果只有第一个参数,则第二个参数默认为r
r+同时读取和写入的模式,若不存在该文件会报错
w写入模式,打开后,文件会清空,若不存在会新建,而后只能写入。
w+同时读取和写入的模式,若不存在会新建,打开后,文件会清空,而后只能写入。
a附加模式,若不存在会新建,打开后不会清空,写入的字符串会加到原文件末尾
2. .write(字符串)可以向文件中写入字符串。注意,其并不会自动在末尾添加换行符。
3. Python只能将字符串添加到文件中。如果是数,应该用str()转换为字符串。

异常

  • 当程序出现异常,会出现traceback。第一,我们希望程序能够尽量正常运行;第二,traceback含有源代码信息,被使用者看到会产生安全隐患。因此,可以用try-except代码块处理异常,输出平易近人的错误信息,并且避免程序崩溃。
try:
    print(5/0)
except ZeroDivisionError:
    print("ERROR: You can't divide zero!")

print('END')

注意:
1. ZeroDivisionError这是一个异常对象。当Python无法完成要求时,会创建这种对象。
2. try:我们把可能导致错误的代码块,放到try:后面。在except行,可以列出多种可能的异常对象(多行except),Python会找到与发生的错误相符的那一个,执行相应的代码,然后接着执行后面的代码。如果没有发生异常,则直接跳过excepy语句。注意,如果希望发生错误时一声不吭,则需要在except 异常对象后跟上pass语句,明确告诉Python什么都不要做。这样还有占位符的功能,提醒此处还有可能是待完善的地方。

  • try-except-else代码块。只有可能引发异常的代码才放进try后,except告诉Python,如果运行过程中出现了指定的异常,该怎么办。else后跟的是,仅当try后的代码成功执行后,才可执行的代码。
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)
    #只有除式成功计算,才需要输出结果
  • 例子:处理FileNotFoundError异常
filename = 'alice.txt'

try:#把可能引起该异常的代码写在try后
    with open(filename) as f_obj:
        contents = f_obj.read() 
    except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
  • 字符串.split()返回组成字符串的单词的列表。str_1.count(str_2)可以计算str_2str_2中出现的次数。

  • 例子,可以计算某一篇文本中,单词的总数。

def count_words(file_name):
    """计算文本单词的数目"""
    try:
        with open("txt/" + file_name) as file_object:
            contents = file_object.read()
    except FileNotFoundError:
        print("Sorry, we can't find " + file_name + " in /Users/xxx/Desktop/CODE/txt ")
    else:
        words = contents.split()
        lenth = len(words)
        print("There are " + str(lenth) + " words in " +
            file_name)

while(True):
    book_name = input("Please input a book's name:")
    count_words(book_name)

文件2

  • 我们可以使用json模块储存用户数据。下面,以储存用户列表和使用用户列表为例。
#保存列表
import json

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

file_name = 'numbers.json'
with open(file_name, 'w') as f_obj:
    json.dump(numbers, f_obj)
#读取列表
import json

file_name = 'numbers.json'
with open(file_name) as f_obj:
    numbers = json.load(f_obj)

print(numbers)

注意:
1. json.dump(file_name, f_obj)负责储存,有两个形参,第一个是待储存的数据。
2. json.load(f_obj)负责将内容读取到内存中,只有一个形参。
3. import json开头先导入json模块。

  • 事实上,我们可以储存各种数据。
"""可以向用户打招呼的程序""

import json

file_name = 'user_name.json'

try:
    with open(file_name) as f_obj:
        name = json.load(f_obj)
except FileNotFoundError:
    name = input("Please input your name: ")
    with open(file_name, 'w') as f_obj:
        json.dump(name, f_obj)
        print("Hi, " + name.title() + " ! We will remember" +
            " you when you come back!")
else:
    print("Welcom back, " + name.title() +" !")
  • 空字符串用None表示。

猜你喜欢

转载自blog.csdn.net/twllx/article/details/75331801