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文件夹,文件就在这个文件夹中。注意,绝对路径在书写的时候,不加左侧的斜杠。
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()
将其转换为整数或浮点数。对于字符串
str
,str[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_2
在str_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
表示。