零基础入门学习Python P29-34 文件、文件系统、永久储存、异常处理

209 阅读4分钟

P29-30 文件读写

程序运行时,数据都会存在缓存中,读写速度快。但一旦程序终止,数据就从缓存中删除了。只有将数据写入硬盘里,数据才能保存。

打开文件:open(文件路径)

image.png mode 打开方式 image.png

文件操作: image.png 当写入文件后,要及时关闭文件。Python写入文件有缓存,如果执行写入后还没关闭文件,就断电了,还是有一部分在缓存中的写入数据会丢失。

f.tell() 返回指针在文件中的位置。计算方法:中文占2个字节,英文占1个字节,换行符占1个字节。

写入文件之前,需要保证文件是以'a'或'w'模式打开的,否则无法写入。

课后题

  1. 下边只有一种方式不能打开文件,请问是哪一种,为什么? f = open('E:/test.txt', 'w') # A f = open('E:\test.txt', 'w') # B f = open('E://test.txt', 'w') # C f = open('E:\test.txt', 'w') # D

B \t会被转译成换行符

  1. 打开一个文件我们使用open()函数,通过设置文件的打开模式,决定打开的文件具有那些性质,请问默认的打开模式是什么呢? 默认只读'r'

  2. 请问 >>> open('E:\Test.bin', 'xb') 是以什么样的模式打开文件的? 以二进制模式新建 'E:\Test.bin' 文件

  3. 尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然需要使用f.close()将文件对象“关闭”,这是为什么呢?

对有写入操作的文件,及时将缓存中的写入数据写入磁盘。

  1. 如何将一个文件对象(f)中的数据存放进列表中? l = list(f)

  2. 如何迭代打印出文件对象(f)中的每一行数据? for each in f: print(each)

  3. 文件对象的内置方法f.read([size=-1])作用是读取文件对象内容,size参数是可选的,那如果设置了size=10,例如f.read(10),将返回什么内容呢? 返回文件指针开始的前10个字节。

  4. 如何获得文件对象(f)当前文件指针的位置? f.tell()

  5. 还是视频中的那个演示文件(record.txt),请问为何f.seek(45, 0)不会出错,但f.seek(46)就出错了呢? f.seek(46) 46 f.readline() Traceback (most recent call last): File "<pyshell#18>", line 1, in f.readline() UnicodeDecodeError: 'gbk' codec can't decode byte 0xe3 in position 4: illegal multibyte sequence

因为使用f.seek()定位的文件指针是按字节为单位进行计算的,演示文件(record.txt)是以GBK进行编码的,按照规则,一个汉字需要占用两个字节,f.seek(45)的位置位于字符“小”的开始位置,因此可以正常打印,而f.seek(46)的位置刚好位于字符“小”的中间位置,因此按照GBK编码的形式无法将其解码!

动动手:

  1. 尝试将文件( OpenMe.mp3 (700 Bytes, 下载次数: 6117) )打印到屏幕上

  2. 编写代码,将上一题中的文件(OpenMe.mp3)保存为新文件(OpenMe.txt) ~

文件写入 将文件中的对话,按发言人,分别写入不同文件。写入时删掉人名。 image.png

主体代码: f = open(inputfile) for each_line in f: if not each_line[:6] == '======': data = each_line.split(':') w = open(data[0]+'_.txt','a') w.write(data[1]) w.close() f.close()

重复代码,可以封装到def函数中。

编程作业

  1. 编写一个程序,接受用户的输入并保存为新的文件,程序实现如图:

image.png

file = input('请输入文件名:') f = open(file,'w') print("请输入内容,单独输入':w'保存退出") while True: data = input() if data == ':w': break f.write(data+\n) f.close()

  1. 编写一个程序,比较用户输入的两个文件,如果不同,显示出所有不同处的行号与第一个不同字符的位置,程序实现如图:

image.png

file1 = input('请输入第一个文件名:') file2 = input('请输入第二个文件名:') f1 = open(file1) f2 = open(file2) different = [] row1 = f1.readline() row2 = f2.readline() count = 1 while row1 or row2: if row1 != row2: different.append(count) count += 1 row1 = f1.readline() row2 = f2.readline()
f1.close() f2.close()

print('两个文件共有',len(different),'处不同') for each in different: print('第',each,'行不一样')

  1. 编写一个程序,当用户输入文件名和行数(N)后,将该文件的前N行内容打印到屏幕上,程序实现如图:

image.png

  1. 呃,不得不说我们的用户变得越来越刁钻了。要求在上一题的基础上扩展,用户可以随意输入需要显示的行数。(如输入13:21打印第13行到第21行,输入:21打印前21行,输入21:则打印从第21行开始到文件结尾所有内容)

image.png

  1. 编写一个程序,实现“全部替换”功能,程序实现如图:

image.png

open f.read() f.close() 替换文字 open('w') f.write() f.close()

P31 文件系统

模块:一个封装了函数和变量的文件,扩展名.py,跟python程序文件一样。模块可以被别的文件引用,并使用其中的函数。 例如,访问系统文件的模块os: import os python的os模块是跨平台的,任一操作系统都可以引用os模块访问其中的文件。

os.getcwd() 返回当前所在文件夹