目录
1. 读取文件
with open('1.txt') as file_object:
#with open('/Users/USERS/Python/1.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
读文件,首先要打开一个文件。函数 open() 接受的参数是要打开的文件名称时,Python 将在当前执行的文件所在的目录中查找文件。函数 open() 接受的参数是 文件的绝对路径+要打开的文件名称时,Python 将根据路径执行查找文件。
关键字 with 在不需要访问文件后将其关闭,使用关键字with时,open() 返回的文件对象只在with代码块内使用,可将值存储在一个列表中,并在with代码块外使用该列表
使用方法 read() 读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量 content 中。同时,因为 read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除末尾的空行,可以在末尾使用 .rstrip() 。用于删除字符串末尾的空白。
输出:3.1415926535
8979323846
2643383279
1.1 逐行读取,创建包含文件各行内容的列表
逐行读取
filename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/1.txt'
lists = []
with open(filename) as file_object:
for line in file_object:
print(line)
#print(line.rstrip()) # 删除每一行末尾的空行
创建包含文件各行内容的列表
filename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/1.txt'
with open(filename) as file_object:
lists = file_object.readlines() # .readlines() 从文件中读取每一行
pi_string = ''
for line in lists:
print(line.rstrip())
pi_string += line.rstrip() # 删除每一行末尾的空行
print(pi_string)
print(pi_string[:15] + '...')
print(lists)
输出: 3.1415926535
8979323846
2643383279
3.141592653589793238462643383279
3.1415926535897...
['3.1415926535\n', '8979323846\n', '2643383279']
2. 写入文件
writefilename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/2.txt'
with open(writefilename, 'w') as file_object: #在文件中写入内容
file_object.write('sdf mlkm h0oewi')
with open(writefilename) as file_object:
print(file_object.readlines()) # .readlines() 从文件中读取每一行
写文件内容时,open() 有两个参数,第一个是要打开的文件名,第二个是指定读取的模式。
如: ‘ r ' 的可读模式,’ w ‘ 的可写模式(清空写), ’ a ‘ 的附加模式, ’ r+ ‘ 的读取和写入模式。
Python 只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用函数 str() 将其装换为字符串格式。同时,如果想要字符串都单独占一行,需要在 write() 语句中包含换行符。也可以使用空格,制表符和空行来设置这些输出格式。
writefilename = '/Users/sw-diag/Desktop/SW-USERS/Lin/Python/2.txt'
num = 21334231
with open(writefilename, 'w') as file_object:
file_object.write('sdf mlkm h0oewi\n')
file_object.write('grw kok ewe 5y\n') # 按行写入
file_object.write(str(num))
with open(writefilename) as file_object:
for line in file_object:
print(line.rstrip()) # .readlines() 从文件中读取每一行
输出: 3.1415926535
8979323846
2643383279
3.141592653589793238462643383279
3.1415926535897...
['3.1415926535\n', '8979323846\n', '2643383279']
sdf mlkm h0oewi
grw kok ewe 5y
21334231
3. 异常
3.1 traceback
Python 使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果程序编写了处理异常的代码,程序会继续运行,如果对异常未处理,程序将停止,并显示 traceback,其中包含有关异常的报告。
print(5/0)
输出:
Traceback (most recent call last):
File "/Users/Python/main.py", line 26, in <module>
print(5/0)
ZeroDivisionError: division by zero
3.2 try-except、else代码块
异常使用 try-except 代码块处理,try-except 代码块让 Python执行指定的操作,同时except 代码块将告诉Python发生异常时怎么办。使用了 try-except 代码块,即使出现了异常,程序也将继续运行。else 代码块依赖于try 代码块,当 try 代码块的成功执行后,将继续执行else代码块的内容
print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit ")
while True:
first_num = input("\nFirst number: ")
if first_num == 'q' :
break
second_num = input('Second_number: ')
if second_num == 'q':
break
try:
answer = int(first_num) / int(second_num) # 只有可能引发异常的代码才需要放在 try 语句
except ZeroDivisionError:
print("You input second_numbers error.") # try 代码块运算检测到异常为 ZeroDivisionError 才执行的代码
except FileExistsError:
print("No find the file.") #try 代码块运算检测到异常为 FileExistsError 才执行的代码
else:
print(answer) # try 代码块运算成功,才能执行的代码
输出:
First number: 2
Second_number: 3
0.6666666666666666
First number: 4
Second_number: 0
You input second_numbers error
First number: q
try-except 代码块提供了两个重要的优点:避免让用户看到 traceback;让程序能够继续分析能够找到其他文件。
3.3 分析文本
.split() 函数按空格分割文件,并将这部分存储到一个列表中。下例是通过split来计算文件中有多少单词。
def count_word(filename):
try:
with open(filename) as f_obj:
content = f_obj.read()
except FileNotFoundError: # t7.lua 文本没找到,将会执行 except内的代码
msg = "The " + filename + "is not find."
print(msg)
#pass #如果遭遇FileNotFoundError异常时,希望它不进行任何处理和反应,但又能够运行,可直接写pass
else:
words = content.split()
num_words = len(words)
print("The " + filename + " has about " + str(num_words) + " words.")
count_word('t6.lua') #单个文本分割
filenames = ['t7.lua','t6.lua','device.txt'] ##多个文本分割
for filename in filenames:
count_word(filename)
pass 语句,可在代码块中使用它来让 Python 什么都不要做,它还充当了占位符,提醒你在程序的某个地方什么都没做,并且以后也许要在这里做些什么。
4. 存储数据
模块 json 能够将简单的 Python 数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。json 可以用在 Python 程序之间分享数据,但它并非Python专用,可以与使用其他编程语言的人分享。
注意:JSON 格式最初是为 JavaScript 开发的,但随后成为一种常见的格式,被包括 Python 在内的众多语言采用
4.1 json.dump() 和 json.load()
函数 json.dump() 接受两个实参:要存储的数据以及可用于存储数据的文件对象。
函数 json.load() 加载存储在 文件中的信息
import json # 1.先导入 json 模块
filename = 'UserString.json' # 2. 通常使用扩展名 .json 来指出文件存储的数据为 JSON 格式
try:
with open(filename) as f_obj: # 5. 以读模式打开文件 numbers.json
r_userstr = json.load(f_obj) # 6. 加载文件 numbers.json 中的信息
except FileNotFoundError:
w_userstr = input("please input user string: ")
with open(filename,'w') as f_obj: # 3. 以写模式打开文件 numbers.json
json.dump(w_userstr,f_obj) # 4. 将字符串列表存储到文件
print("1. " + w_userstr)
else:
print("2. " + r_userstr)
第一次运行时,没有找到 UserString.json 文件,执行 except语句,输入字符串,json.dump将字符串列表存储到文件。第二次运行时,已存在 UserString.json 文件,通过 json.load() 直接读取文件内容。
4.2 重构
代码能够正常运行,但可以做进一步改进--将代码划分为一系列完成具体工作的函数,这样的过程称为重构。重构让代码更清晰,更易于理解,更容易扩展。