您的位置:首页 > 编程语言 > Python开发

Python学习笔记(9)-文件和异常

2016-12-14 21:06 639 查看
从文件中读取数据
读取整个文件

文件路径

逐行读取

写入文件

异常

存储数据

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