Python---文件操作
一、模式
'w'模式:写模式
'r'模式:读模式
'a'模式:追加的方式,
'+' 出现在上面三种后面:表示可以同时读写文件,
'b' 出现在上面三种后面:表示以字节的方式(在Linux没用,也不能指定编码)
二、操作
1、在Python 中一个文件可以被循环遍历:打印出文件的内容
with open('file','r') as f:
for item in f:
print(i)
2、文件没有修改,只有覆盖,写的时候从光标位置开始写
3、在不知道文件是什么编码时,Latin-1编码适合大部分情况
4、读文件:f.read()读的是字符,全部读完
with open('file', 'r') as f:
print(f.read())
>>> 23333
66666
00000
5、f.readline()读一行, f.readlines()全部返回以列表的形式
with open('file', 'r') as f:
print(f.readlines())
>>> ['23333\n', '66666\n', '00000']
with open('file', 'r') as f:
print(f.readline())
>>> 23333
6、write()接收字符串
with open('file', 'w') as f:
print(f.write('csdn'))
7、writelines()接收列表,也可以接收字符串
with open('file', 'w') as f:
print(f.writelines(['6666','888']))
8、f.tell()当前光标的位置,显示当前位置多少个字节(\n也算一个字节),每换行就会有\r\n
with open('file', 'r') as f:
print(f.tell())
f.readline()
print(f.tell())
f.readline()
print(f.tell())
>>> 0
6
12
9、 f.flush()保存文件,从缓冲区提交到硬盘
with open('file', 'w') as f:
f.write('2333')
f.flush()
a = input('number')
f.write('6666')
10、f.truncate(x)文件截断x个字符,需要在r+的模式下。从当前位置起截断;截断之后 size 后面的所有字符被删除。
with open('file', 'r+') as f:
print(f.truncate(9))
11、f.seek(x,[模式])控制光标移动到x字符从文件开头开始计算,而且要以b模式操作,读字节
在utf-8编码下,1个汉字占3字节。在unicode编码下,1个汉字占2字节。
有三种模式:
0模式:默认是0模式 从文件开头算位置 (绝对位置) 每换行就会有\r\n
with open('file', 'rb') as f:
print(f.tell())
print(f.seek(6))
print(f.read())
print(f.tell())
0
6
b'3456\r\n789465\r\n132sdf'
26
1模式: 从上一个位置开始计算,正值向前,负值向后 (相对位置)
with open('file', 'rb') as f:
print(f.seek(12))
print(f.seek(-6,1))
print(f.read())
print(f.tell())
>>> 12
>>> 6
>>> b'345641\r\n78946541\r\n132sdf'
>>> 30
2模式:从文件末尾开始计算 值要为负
with open('file', 'rb') as f:
print(f.seek(-6,2))
print(f.read())
print(f.tell())
>>> 20
>>> b'132sdf'
>>> 26
12、rb模式相当于先bytes编码(用bytes,记得编码)然后utf-8解码
a = bytes('快是哟个双节棍'.encode('utf-8'))
print(a.decode('utf-8'))
>>> 快是哟个双节棍
import导入操作:
会把引用的文件执行一遍,然后在引用到文件内。(会把输出提前打印)
找模块时会去当前路径里面找(sys.path)模块,并不是因为同级。
from 包名 (包名,嵌套的包用 ' . ' 隔开) import .. 可以引用到子目录
from test.cal import add
from package import * 会把文件全部执行一遍,然后在引用变量。这个方法并不推崇,因为不清楚这个包里都有什么模块,如果重名,就重写了该模块。
当import单下划线方法时,此方法不在*里面,而需单独调用,受保护的包
from package import new_package 相当于执行new_package的 __init__ 文件(写from package import py文件 就可以导入当前层的py文件)
__name__ :当前执行的文件名
print(__name__)
>>> __main__
为了防止当前文件不被其他文件调用时,写上判断就能防止:
if __name__ == '__main__':
main()
__file__: 当前文件名,pycharm会自动打印绝对路径
print(__file__)
>>> E:/python/python程序/test1/test2/lab.py
实际上:
动态导入模块:__import__('file_name') 拿到的是file_name的模块,不能往下继续调用
a = __import__('test1')
importlib模块:importlib.import_module('file_name') 是直接导入模块,并不是拿的*模块
import importlib
a = importlib.import_module('test1.test4.cal')
a.add(3,5)
>>> 8
from . import cal. 写在初始化文件里,可以导入其他文件