P29-30 文件读写
程序运行时,数据都会存在缓存中,读写速度快。但一旦程序终止,数据就从缓存中删除了。只有将数据写入硬盘里,数据才能保存。
打开文件:open(文件路径)
mode 打开方式
文件操作:
当写入文件后,要及时关闭文件。Python写入文件有缓存,如果执行写入后还没关闭文件,就断电了,还是有一部分在缓存中的写入数据会丢失。
f.tell() 返回指针在文件中的位置。计算方法:中文占2个字节,英文占1个字节,换行符占1个字节。
写入文件之前,需要保证文件是以'a'或'w'模式打开的,否则无法写入。
课后题
- 下边只有一种方式不能打开文件,请问是哪一种,为什么? 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会被转译成换行符
-
打开一个文件我们使用open()函数,通过设置文件的打开模式,决定打开的文件具有那些性质,请问默认的打开模式是什么呢? 默认只读'r'
-
请问 >>> open('E:\Test.bin', 'xb') 是以什么样的模式打开文件的? 以二进制模式新建 'E:\Test.bin' 文件
-
尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然需要使用f.close()将文件对象“关闭”,这是为什么呢?
对有写入操作的文件,及时将缓存中的写入数据写入磁盘。
-
如何将一个文件对象(f)中的数据存放进列表中? l = list(f)
-
如何迭代打印出文件对象(f)中的每一行数据? for each in f: print(each)
-
文件对象的内置方法f.read([size=-1])作用是读取文件对象内容,size参数是可选的,那如果设置了size=10,例如f.read(10),将返回什么内容呢? 返回文件指针开始的前10个字节。
-
如何获得文件对象(f)当前文件指针的位置? f.tell()
-
还是视频中的那个演示文件(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编码的形式无法将其解码!
动动手:
-
尝试将文件( OpenMe.mp3 (700 Bytes, 下载次数: 6117) )打印到屏幕上
-
编写代码,将上一题中的文件(OpenMe.mp3)保存为新文件(OpenMe.txt) ~
文件写入
将文件中的对话,按发言人,分别写入不同文件。写入时删掉人名。
主体代码: 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函数中。
编程作业
- 编写一个程序,接受用户的输入并保存为新的文件,程序实现如图:
file = input('请输入文件名:') f = open(file,'w') print("请输入内容,单独输入':w'保存退出") while True: data = input() if data == ':w': break f.write(data+\n) f.close()
- 编写一个程序,比较用户输入的两个文件,如果不同,显示出所有不同处的行号与第一个不同字符的位置,程序实现如图:
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,'行不一样')
- 编写一个程序,当用户输入文件名和行数(N)后,将该文件的前N行内容打印到屏幕上,程序实现如图:
- 呃,不得不说我们的用户变得越来越刁钻了。要求在上一题的基础上扩展,用户可以随意输入需要显示的行数。(如输入13:21打印第13行到第21行,输入:21打印前21行,输入21:则打印从第21行开始到文件结尾所有内容)
- 编写一个程序,实现“全部替换”功能,程序实现如图:
open f.read() f.close() 替换文字 open('w') f.write() f.close()
P31 文件系统
模块:一个封装了函数和变量的文件,扩展名.py,跟python程序文件一样。模块可以被别的文件引用,并使用其中的函数。 例如,访问系统文件的模块os: import os python的os模块是跨平台的,任一操作系统都可以引用os模块访问其中的文件。
os.getcwd() 返回当前所在文件夹