Python学习笔记(9)-文件和异常
2016-12-14 21:06
639 查看
从文件中读取数据
读取整个文件
文件路径
逐行读取
写入文件
异常
存储数据
然后在python代码中打开,
代码:
打印结果和文件内容一致
代码:
或者
注意:Windows系统下是反斜杠(\),如果有时候仍旧错误,可在字符串引号前加 r
代码:
结果:
会有空行,是因为每一行结尾都有
以上代码是直接读取某一行的,若使用
代码:
结果:
同上,可处理末尾的换行符,最后一个没有是因为创建文件的输入内容的时候最后一行没有敲换行符
w:已写入的模式打开,如果不存在,则自动创建
r :以只读的模式打开,
a:以附加的模式打开,内容末尾添加
r+:以读取和写入的模式打开
代码:
再打开相应路径下的文件,可看到内容已经改变。
Python只能将字符串写入文本文件,若要存数值,需要先用str()函数转换成字符串。
在语句
代码:
结果:
上边例子中,若打开文件的模式是
代码:
结果:
代码:
打开文件目录会发现新建了MyNumber.txt文件,内容为
上面是写入的函数,而读取文本文档中的数据可用
代码:
这可以算是一种程序之间简单的共享数据的方式
注意:
有时候需要序列化的数据不是字典或者列表,而是自定义的
代码:
结果:
但这种方式兼容性较差,无法适应其他类,可用lambda表达式
代码:
结果:
但是反序列化的时候,只能定义函数来转化了,
代码:
结果:
读取整个文件
文件路径
逐行读取
写入文件
异常
存储数据
1.从文件中读取数据
读取整个文件
先在项目所在的目录下创建一个文本文件命名为my_data.txt,内容如下:asdf qwer zxcv
然后在python代码中打开,
代码:
with open('my_data.txt') as mfile: contents = mfile.read() print(contents)
打印结果和文件内容一致
open()里参数为要打开的文件名(包括后缀),并返回一个表示文件的对象,存储在自定义的变量名(mfile)中,关键字
with在不需要访问文件的时候自行关闭该文件,
read方法为读取文件,返回字符串。
文件路径
open方法执行时,会在当前文件所在的目录查找要打开的文件,若文件在其他位置,可用绝对路径的方法来描述。
代码:
with open('now/my_data.txt') as mfile: # 当前.py文件路径下的now文件夹下的my_data.txt文件(相对路径)
或者
with open('E:\Study\python3\python_work\my_data.txt') as mfile: # 绝对路径表示
注意:Windows系统下是反斜杠(\),如果有时候仍旧错误,可在字符串引号前加 r
逐行读取
读取整个文件返回字符串的形式用read,读取某一行用
for xxx in xxx
代码:
with open('now\my_data.txt') as mfile: for line in mfile: # 逐行读取文件打印 print(line)
结果:
asdf qwer zxcv
会有空行,是因为每一行结尾都有
\n标记(这里空换行再空行是因为print也自带换行的标记),可用
rstrip()方法删除末尾的空白。
以上代码是直接读取某一行的,若使用
xxx.readlines()方法,则返回存储每一行数据的一个列表
代码:
with open('now\my_data.txt') as mfile: lines = mfile.readlines() # readlines()方法将每一行作为一条数据存储到列表中并返回 print(lines)
结果:
['asdf\n', 'qwer\n', 'zxcv']
同上,可处理末尾的换行符,最后一个没有是因为创建文件的输入内容的时候最后一行没有敲换行符
2.写入文件
调用open方法时,除了传入文件名字作为参数,还可传递打开文件的模式,默认以只读(r)模式打开
w:已写入的模式打开,如果不存在,则自动创建
r :以只读的模式打开,
a:以附加的模式打开,内容末尾添加
r+:以读取和写入的模式打开
代码:
with open('now\my_data.txt', 'w') as mfile: mfile.write('葫芦娃最帅→_→') #使用write()方法,往文件中写入内容
再打开相应路径下的文件,可看到内容已经改变。
Python只能将字符串写入文本文件,若要存数值,需要先用str()函数转换成字符串。
3.异常
Python中的异常使用try-except代码块来实现的
在语句
print(5/0)中,显然,0不能做除数,运行会报错,利用
try-except代码块可处理程序中无法预料的可能发生错误的代码,避免程序崩溃o(≧口≦)o
代码:
try: print(5 / 0) except ZeroDivisionError: print("出错啦♪(^∇^*)") else: # 可增添else代码块,仅在没有错误的时候执行 print("成功啦~\(≧▽≦)/~")
结果:
出错啦♪(^∇^*)
上边例子中,若打开文件的模式是
r,或者默认的时候,文件本身不存在,所以此时程序会报错崩溃,可用异常处理次错误,避免程序崩溃的不友好的提示。
代码:
try: with open('notfound.txt') as myFile: contents = myFile.read() except FileNotFoundError: print("没有找到该文件") # 此处可换成语句pass,表示什么都不做,直接运行接下来的代码
结果:
没有找到该文件
4.存储数据
上面例子中存储数据用的是函数write(),但是该函数只能传入字符串参数,若是复杂的数据结构,如列表等,则需要其他的函数来代替。使用json模块,可以将简单的python数据结构存储到文件中。
代码:
import json # 先导入json模块 numbers = ['1', '2', '3', '4', '5', '6'] # 创建一个数组 with open('MyNumber.txt', 'w') as myFile: # 以写入的模式打开,如果没有则创建文件 json.dump(numbers, myFile) # 参数1是要写入的数据,参数2是写入到哪个文件
打开文件目录会发现新建了MyNumber.txt文件,内容为
["1", "2", "3", "4", "5", "6"]
上面是写入的函数,而读取文本文档中的数据可用
json.load()
代码:
import json with open('MyNumber.txt', 'r') as myFile: numbers = json.load(myFile) # 直接将读取的数据返回列表传递给numbers print(numbers)
这可以算是一种程序之间简单的共享数据的方式
注意:
json.dumps()和json.dump(),前者是将数据序列化,后者是将数据序列化后存入某个
file-like object文件中,类似的
json.loads()和json.load()也是一样
有时候需要序列化的数据不是字典或者列表,而是自定义的
class例如
Person类,此时
json.dumps()传入
Person实例的话会抛出
is not JSON serializable的错误,可在写一个转换函数,调用
json.dumps()的时候参数
default=xxx,xxx即为转换函数的名字,例如
代码:
import json # 导入json模块 class Person(object): # Person类 def __init__(self, age, name): self.age = age self.name = name def tojson(p): # 定义的tojson函数(注意:不在person内部),传入person实例 return { 'age': p.age, 'name': p.name } p = Person(18, 'Tom') print (json.dumps(p, default=tojson)) # 参数default=转换函数的名字
结果:
{"age": 18, "name": "Tom"}
但这种方式兼容性较差,无法适应其他类,可用lambda表达式
代码:
import json class Person(object): def __init__(self, age, name, address): self.age = age self.name = name self.address = address p = Person(19, 'Tom', 'china') # 使用lambda表达式,对象的.__dict__属性是每个对象都有的字典,包含了该对象的属性(定义了__slots__的除外) print (json.dumps(p, default=lambda obj: obj.__dict__))
结果:
{"age": 19, "name": "Tom", "address": "china"}
但是反序列化的时候,只能定义函数来转化了,
json.loads()函数将序列化数据转化成字典,再定义一个将字典转化成对象的函数即可。
代码:
import json class Person(object): def __init__(self, age, name, address): self.age = age self.name = name self.address = address json_data = '{"age": 33, "name": "Jack", "address": "Japan"}' # json测试数据 def json2obj(str): return Person(str['age'], str['name'], str['address']) # 封装成对象 print (json.loads(json_data, object_hook=json2obj)) # 参数object_hook=转换函数的名字
结果:
<__main__.Person object at 0x107592ed0>
相关文章推荐
- python基础学习笔记-文件与异常
- Python的学习笔记——文件与异常
- Python学习笔记06-类与文件和异常
- Python学习笔记三(文件与异常)
- Head First Python学习笔记2——文件与异常
- 阿齐兹的Python学习笔记——文件与异常
- [Python]学习笔记之文件和异常
- python笔记(十) - 异常和文件处理
- Python 学习笔记【文件对象】
- Python3.3 学习笔记6 - 文件
- python学习笔记3-解析配置文件ConfigParser模块
- python学习笔记5-核心类型-元组和文件及其他
- python2.7 学习笔记 (四)——异常
- Python3.3 学习笔记5 - 异常处理
- Python学习笔记——文件对象和操作(1)
- java学习笔记7 - Spring mvc 统一异常处理和静态文件的配置
- python学习笔记11-异常总结
- python学习笔记——文件
- Python学习笔记 === python脚本文件快速浏览说明
- Python学习笔记(10):异常