0.日常吐槽
小更一下,内容不多,其实完全是因为看论文看到怀疑人生,想随便写点东西发泄一下。
我为什么要上学。。。
1.文件的基本操作
用Python打开一个文件只需用open(file,[mode=r])
函数,第一个参数是文件的位置,第二个参数是打开模式,默认为r
只读模式。常用的模式如下:
打开模式 | 执行操作 |
---|---|
'r' | 以只读方式打开文件(默认) |
'w' | 以写入的方式打开文件,会覆盖已存在的文件 |
'x' | 如果文件已经存在,使用此模式打开将引发异常 |
'a' | 以写入模式打开,如果文件存在,则在末尾追加写入 |
'b' | 以二进制模式打开文件 |
't' | 以文本模式打开(默认) |
'+' | 可读写模式(可添加到其他模式中使用) |
'U' | 通用换行符支持 |
举个例子:
>>> f = open('E:\\test.txt','r')
>>> f
<_io.TextIOWrapper name='E:\\test.txt' mode='r' encoding='cp936'>
打开文件之后,可以对文件进行一些列操作。常见的操作如下表:
文件对象方法 | 执行操作 |
---|---|
f.close() | 关闭文件 |
f.read([size=-1]) | 从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回 |
f.readline([size=-1]) | 从文件中读取并返回一行(包括行结束符),如果有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.close()
关闭文件。虽然Python有回收机制,即使忘记关闭也不会有什么太严重的后果,但这是一个良好的习惯。 -
mode=r
的只读模式下,无法对文件进行修改,但可以读取文件里的数据。而mode=w or a
可以对文件就行修改,但若试图用f.read
读取文件会报错,提示not readable。 -
mode=w
和mode=a
的区别是如果文件已存在w会覆盖原文件,并在创建的新文件里进行写入;而a会在原文件后继续写入。文件不存在时两者都会创建一个新文件。
Example 1:
>>> f = open('E:\\test.txt')
>>> f.read()
'轻轻的我走了,\n正如我轻轻的来;\n我轻轻的招手,\n作别西天的云彩。'
>>> f.read()
''
f.read()
没有参数时,会返回所有剩余字符。再次read时,因为指针已经在最后,所以输出了一个空字符。若要让指针归零,可以使用f.seek()
函数。
>>> f.seek(0,0)
0
>>> f.read(10)
'轻轻的我走了,\n正如'
>>> f.close()
Example 2:
>>> f = open(r'e:\test.txt')
>>> f.readline()
'轻轻的我走了,\n'
>>> f.readline()
'正如我轻轻的来;\n'
利用f.readline()
逐行读取,同样光标会逐渐向后移动。同样文件可以直接用在for
循环中,循环时也是逐行读取。
>>> f.seek(0,0)
0
>>> for eachline in f:
print(eachline)
轻轻的我走了,
正如我轻轻的来;
我轻轻的招手,
作别西天的云彩。
循环也是从光标处开始的。例如:
>>> f.seek(10,0)
10
>>> for eachline in f:
print(eachline)
了,
正如我轻轻的来;
我轻轻的招手,
作别西天的云彩。
10是字节,一个汉字是两个字节,因此10个字节就是5个汉字。
Example 3:
>>> f = open(r'e:\test.txt', 'w')
>>> f.write('轻轻的我走了,\n正如我轻轻的来;\n我轻轻的招手,\n作别西天的云彩。')
33
>>> f.close()
>>> f = open(r'e:\test.txt', 'r')
>>> f.read()
'轻轻的我走了,\n正如我轻轻的来;\n我轻轻的招手,\n作别西天的云彩。'
>>> f.close()
这样就写入了一个文件。
2.pickle(泡菜)模块
不知道开发者怎么想的,这么高大上的东西要起一个如此接地气的名字...
之前写的内容一直是用文本格式,在很多情况下我们需要保存或读取诸如字典、列表等各式各样的数据,这时pickle
模块就十分实用。pickle
是利用二进制储存和读取数据,说起来就很简单,就是一个存储一个读取。使用之前要import pickle
加载模块。
2.1 存储
存储时以mode=wb
打开文件,然后利用pickle.dump(data,file)
函数将数据写入文件即可。也是蛮形象的,将泡菜倒(dump)缸里腌制起来=.=。例如储存一个列表:
>>> import pickle
>>> list1 = [1, 3.14, 'Python', int]
>>> f = open('test.pkl', 'wb')
>>> pickle.dump(list1, f)
>>> f.close()
这样根目录里就出现了一个test.pkl
的文件。当然文件类型随意了,我的.pkl也是随便写的。
2.2 载入
载入时以mode=rb
打开文件,然后利用pickle.load(file)
导入文件即可。我们将刚刚存储的列表在读取出来。
>>> f = open('list1','rb')
>>> list2 = pickle.load(f)
>>> print(list2)
[1, 3.14, 'Python', <class 'int'>]
>>> f.close()
这个模块虽然简单,但却非常实用。比如如果我们有巨大的数据,就可以利用pickle泡菜技术将数据存到文件里,需要的时候在加载出来,这样可以大大简化代码。
还有一个OS
模块对文件也是挺有用的,今天先不写了,等写完模块或者什么时候想写了再学吧。继续看论文了。
往期回顾
Python学习笔记(0)之Hello,python!
Python学习笔记(1)之列表list
Python学习笔记(2)之元组、字典&集合
Python学习笔记(3)之字符串string
Python学习笔记(4)之函数(一)
Python学习笔记(5)之函数(二)