【小甲鱼Python】文件:因为懂你,所以永恒&&课后作业

笔记

打开文件

使用open()来打开文件。

其中常用的是前两个参数。   

参数file如果带路径则在路径中寻找文件,如果不带路径则在当前文件夹寻找文件。

 写路径时,要么用/,要么用\\。

参数mode:

打开模式执行操作
'r'以只读方式打开文件(默认)
'w'以写入的方式打开文件,会覆盖已存在的文件
'x'如果文件已经存在,使用此模式打开将引发异常,以写入模式打开
'a'以写入模式打开,如果文件存在,则在末尾追加写入
'b'以二进制模式打开文件
't'以文本模式打开(默认)
'+'可读写模式(可添加到其他模式中使用)
'U'通用换行符支持

 

其中,在使用‘w’模式时,如果file不存在,则会自动创建;如果file存在,则会创建一个新的文件覆盖掉已存在的文件。

想要接着之前的进度继续对文件进行写入,用‘a’模式。

文件对象方法

文件对象方法执行操作
f.close()关闭文件
f.read([size=-1])从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回
f.readline([size=-1])从文件中读取并返回一行(包括行结束符\n),如果有size有定义则返回size个字符
f.write(str)将字符串str写入文件
f.writelines(seq)向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象
f.seek(offset, from)在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节(不是字符!!!)
f.tell()返回当前在文件中的位置(即文件指针的位置)
f.truncate([size=file.tell()])截取文件到size个字节,默认是截取到文件指针当前位置

f.read():当没有设置参数的时候,会默认全部读取,并且文件指针指向文件末尾(EOF,end of file)。

一个中文字符占两个字节,英文字符,数字,其他符号等占一个字节。文件指针是按字节算的。例如:

f.seek(0,0):将指针定位回文件开头。

打印文件

list(file)会按照文件中的换行符把文件分为若干个字符串元素存储在列表中,例如:

这时可用如下方法打印:

但这种方法效率不高。

可以直接用for将文件打印:

这种方法效率高。


课后作业

测试题:

0. 下边只有一种方式不能打开文件,请问是哪一种,为什么?

>>> 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()函数,通过设置文件的打开模式,决定打开的文件具有那些性质,请问默认的打开模式是什么呢?
答:‘rt’,只读文本模式。

2. 请问 >>> open('E:\\Test.bin', 'xb') 是以什么样的模式打开文件的?
答:以“可写入以及二进制模式”打开文件“E:\\Test.bin”。
这里要注意的是'x'和'w'均是以“可写入”的模式打开文件,但以'x'模式打开的时候,如果路径下已经存在相同的文件名,会抛出异常,而'w'模式的话会直接覆盖同名文件。
因此,'w'模式打开文件会比较危险,容易导致此前的内容遗失,因此使用'w'模式打开文件前先检查该文件名是否已经存在显得非常重要!

3. 尽管Python有所谓的“垃圾回收机制”,但对于打开了的文件,在不需要用到的时候我们仍然需要使用f.close()将文件对象“关闭”,这是为什么呢?
答:python拥有垃圾收集机制,会在文件对象的引用计数降至0的时候自动关闭文件,所以在python编辑里,不会造成内存泄露的危险。但是python会缓存你写入的数据,如果中间断电,缓存的数据就不会写入文本了



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

5. 如何迭代打印出文件对象(f)中的每一行数据?
答:

for each_line in f:
    print(each_line)


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

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

8. 还是视频中的那个演示文件(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 <module>

    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编码的形式无法将其解码!


动动手:

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

f = open('C:\\Users\\57574\\Downloads\\OpenMe.mp3','r')
for each_line in f:
    print(each_line)

输出结果如下:

长期使用Windows操作系统的朋友很容易被扩展名所误导,认为扩展名决定文件类型,其实这种观念是错误的!



其实这就跟一个姓张的坏人,尽管把名字改为了“张好人”,但他还是一个坏人是一个道理的^_^



关于文件的扩展名,初学者容易走进的误区:



误区一:文件扩展名是一个文件的必要构成部分



一个文件可以有或没有扩展名,对于打开文件操作,没有扩展名的文件需要选择程序去打开它,有扩展名的文件会自动用设置好的程序(如有)去尝试打开(是“尝试打开”,而不是“打开”的原因参看下面的第2个误区),文件扩展名是一个常规文件的构成部分,但一个文件并不一定需要一个扩展名。



误区二:文件扩展名表明了该文件是何种类型



文件扩展名可以人为设定,扩展名为TXT的文件有可能是一张图片,同样,扩展名为M-P3的文件,依然可能是一个视频。


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

答:

f1 = open('C:\\Users\\57574\\Downloads\\OpenMe.mp3','r')
f2 = open('C:\\Users\\57574\\Downloads\\OpenMe.txt','x')
f2.write(f1.read())
f1.close()
f2.close()

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值