python-文件和异常

操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操
作系统打开一个文件对象(又称文件描述符),然后,通过操作系统提供的接
口从这个文件对象操作;
读取文件的过程
1,打开文件
2.向文件中写入内容
3.关闭文件

1.打开文件

f = open('/etc/passwd', 'r')    # f是文件对象
open'文件名''打开的方式'print f

输出结果open file ‘/etc/passwd’, mode ‘r’ at 0x7fe016c2a6f0
mode :打开的模式
at后跟的是文件对象在内存中的地址
如果文件不存在, open() 函数就会抛出一个 IOError 的错误,并且
给出错误码和详细的信息告诉你文件不存在;

###open函数的模式

r 以读的方式打开,定位到文件开头 , 默认的 mode
r+ 以读写的方式打开,定位文件开头 , 可以写入内容到文件
w 以写的方式打开,打开文件的时候会清空文件的内容,并且不能读
w+ 以读写的方式打开,定位到文件头,并且打开文件的时候也会清空文件的内容
a 以写的方式打开,定位到文件的末尾,是一个追加的操作 , 但并不允许读
a+ 以读写的方式打开,定位到文件的末尾,追加的方式。
在使用以上 mode 打开文件的时候,如果增加了b 模式,表示以二进制方式打开

2,对于文件的读操作

读取文件中的内容,以字符串形式返回;
如果文件打开成功,接下来,调用 read() 方法可以一次读取文件的
全部内容;

print f.read()

这里写图片描述

# 读取文件的一行内容, 以字符串返回;
print f.readline()
print f.readline()

这里写图片描述

读取每行文件以列表的方式返回
print(f.readlines())

*文件对象时可迭代的,如果是几百兆的文件直接用read读取,如果是xG文件,建议用for循环遍历,底层是迭代器,节约内存
• 如果文件很小, read() 一次性读取最方便;
• 如果不能确定文件大小,反复调用 read(size)
• 比较保险;如果是配置文件,调用 readlines()

• 二进制文件
要读取二进制文件,比如图片、视频等等,用 ‘rb’ 模式打开文件即可

 f = open('/root/test.jpg', 'rb')
f.read()
'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...' # 十六进制表示的字节

•字符编码
要读取非 ASCII 编码的文本文件,就必须以二进制模式打开,再解
码,Python 还提供了一个 codecs 模块帮我们在读文件时自动转换编
码,直接读出 unicode。

import codecs
with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
f.read() # u'\u6d4b\u8bd5'

3.对于文件的写操作

f = open("/tmp/passwd", 'a+')
li = ['user1', 'user2', 'user3']
# 文件写入时,也会移动指针,
f.write("hello")
f.writelines(['gcc\n', 'c++\n'])  #以换行符为分隔符,按行将信息写进文件
f.writelines([line+"\n" for line in  li])

4.关闭文件


f.close()

文件的其它操作

f.seek(offset[,whence])
seek方法是移动文件指针的:
1). 第一个参数是:偏移量>0, 向右移动; 偏移量<0, 向左移动
2). 第2个参数是: 0:代表文件开头, 1代表当前位置, 2代表文件最后;

f = open('/tmp/linux.txt', 'w+')

f.write('hello\n')
f.write('world\n')

# 移动到文件开头的第2个字节后面;
f.seek(2,0)
print f.read()

# 移动到文件最后的第2个字节前面;\n代表一个字节;
# f.seek(-2, 2)
print f.read()

这里写图片描述

# # 获取文件指针现在的位置;
print f.tell()
print f.closed  #查看文件是否关闭   返回bool值
print f.mode    #查看文件的权限
print f.name    #查看文件的文件名

with语句

一般情况打开一个文件,经过操作之后,都要显式的执行xx.close() 将文件关
闭 .with 用于需要打开、关闭成对的操作,可以自动关闭打开对象 .

# with语句会在代码块执行结束自动关闭文件对象;
with open('/etc/passwd') as f:
    f.read()

    print "in with:",  f.closed

print "out with:", f.closed

这里写图片描述

异常

Python使用被称为异常的特殊对象来管理程序执行期间发生的错误,每当发生让Python不知所措的失误时,他都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
异常是try-except代码块处理的,这个代码块让Python执行指定的操作,同时报告Python发生异常时该怎麼办。使用了该代码块,即便出现了异常。程序也将继续运行;
优点:编写健壮的程序,即使面对无效的数据和缺少资源也能够继续运行,从而能够抵御无意的用户错误和恶意的攻击

  • 使用try-except代码块,将可能引发错误的语句放到里面
print("Give me two numbers,and I'll devide them,"
      "Enter 'q' to quit.")
while True:
    frist_number=input('Frist number:')
    if frist_number == 'q':
        break
    second_number=input('Second number:')
    try:
        answer = int(frist_number) / int(second_number)
    except ZeroDivisionError:   #捕捉错误ZeroDivisionError
        print("You can't divide by 0")
    else:                       #r如果没捕捉到,则输出结果
        print(answer)

这里写图片描述

储存数据

模块json让你能够将简单的数据结构转存到文件中,并在程序再次运行时加载该文件中的和数据。
使用json.dump()和josn,load()
前者用来储存数据,后者用来将文件中的数据读取到内存中。

import json

numbers=[1,2,3,4,5,6,8,9]

filename = 'numbers.json'
with open(filename,'w') as f_obj:  #如果该文件不存在则自动创建,并且写入数据
    json.dump(numbers,f_obj)



with open(filename) as f_obj:   
    numbers = json.load(f_obj)  #将数据读取道内存中

print(numbers)

这里写图片描述

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/79867500