欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python---文件操作

程序员文章站 2024-03-12 19:27:44
...

一、模式

'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

实际上:

Python---文件操作

动态导入模块:__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.  写在初始化文件里,可以导入其他文件

相关标签: import