python文件操作

文件操作(数据库第一天)

引入

什么是文件:
文件是保存在持久化存储设备上的一段数据。

文件分类:
文本文件
二进制文件

字节串类型:
字节串与str不同,字节串以字节序列值表达数值,更方便用来处理二进制数据。

字节串和字符串相互转化:
-普通的英文字符串可以通过前面加b来转换成字节串:b"hello"
-变量或包含非英文的字符串转换成字节串方法:str.encode()
-字节串转换成字符串方法:bytes.decode()
注意:所有的字符串都可以转换成字节串,但不是所有的字节串都能转成字符串。

文件读写操作

读:从文件中读取数据
写:向文件中写入数据

打开文件,写入数据,关闭文件。

打开文件

如果不确定文件类型,就是用二进制方式打开,也就是wb+
file_object=open(filename,mode,buffering,encoding=None)
成功返回一个文件对象。
filename:文件名
mode:打开文件方式
buffering:1 行缓冲,默认 默认缓冲
encoding="UTF-8:文件编码方式
mode:r,w,a,r+,w+,a+,rb,wb,ab,rb+,wb+,ab+
r:读方式打开,文件需要存在
w:写方式打开,文件不存在则创建,存在清空原有内容
a:追加模式,不存在创建,存在则续写
r+:读写模式打开,文件必须存在
w+:读写模式打开,不存在创建,存在清空原有内容
a+:追加并可读模式,不存在创建,存在续写
rb:二进制读模式
wb:二进制写模式
ab:二进制追加

纯r的话需要文件存在,w如果文件不存在则创建,否则清空。
如果要续写的话还是使用a
二进制模式都加一个b,增强读写模式增加一个+
以二进制方式打开的话,读取的是字节串。需要进行decode
以二进制方式写入,写入的需要是字节串,可以在前面加b,或者encode。

关闭文件

file_object.close()
print(,end="")# end打印完前面后的操作,可以进行不换行。

循环读取文件

# 循环读取文件
file = open("file.txt", 'r')
while True:
    message = file.read(1)
    if not message:
        break
    print(message, end="")
file.close()
readlines(size)

按行读取

迭代取值

当使用读方式打开文件时,该文件是可迭代对象,可以通过
for line in file:
print(line,end="")
来进行读取按行输出。

复制

# 复制

src = open("file.txt", "rb+")
dst = open("dst.txt", "wb+")

for line in src:
    dst.write(line)
    
dst.close()
src.close()

查字典

# 练习1:使用dict.txt完成,查询单词,返回解释,否则返回Not Found

def search(key):
    # 通过key查询单词是否在其中
    file = open("dict.txt", "rb+")
    dict = {}
    for line in file:
        line = line.decode()
        list = line.split(" ", 1)
        if list[0] > key:
            break
        elif list[0] == key:
            return line.strip()
    return 'Not Found'

while True:
    key = input("输入单词:")
    message = search(key)
    print(message)

文件偏移量
file.tell()
获取文件偏移量

seek(offset[,whencel])
移动文件偏移量位置
offset 代表相对于某个位置移动的字节数。负数表示向前移动,正数表示向后移动。
whence 是基准位置的默认值为0,代表从文件开头算起,1代表当前位置,2代表从文件末尾。(二进制模式)

空洞文件
文件开头写入,改变偏移量,然后文件末尾写入,预占容量。
file.seek(1024*1024,2)
file.write(b'end')

时间

time()
localtime()
ctime()

文件每2s循环写入,序号可以衔接

# 首先打开文件,查看最后的序号是多少,
# 然后从该序号后开始依次加1,写入文件ctime。

import time

# 打开文件
file = open('time.txt', 'rb+')
for line in file:
    line = line.decode()
    list = line.split('.')

    n = int(list[0])

try:
    i = n
except Exception:
    i = 0

while True:
    i += 1
    message = f"{i}. {time.ctime()}"
    file.write(message.encode())
    file.write(b"\n")
    time.sleep(2)
    file.flush()

或者

import time

# 打开文件
file = open('time.txt', 'rb+')

i = len(file.readlines())

while True:
    i += 1
    message = f"{i}. {time.ctime()}"
    file.write(message.encode())
    file.write(b"\n")
    time.sleep(2)
    file.flush()

os模块

Python标准库模块,包含了大量的文件处理函数

os.path.getsize(file)
获取文件大小,参数指定文件,返回值返回文件大小。

查看文件列表
os.listdir()

判断文件是否存在 bool
os.path.exists(file)

删除文件
os.remove(file)

总结:
open()
read()
write()
close()
文件拷贝

上一篇:postgresql/lightdb字段typemod属性的内部实现及物理表示pg_attribute.atttypmod


下一篇:《Web安全之机器学习入门》笔记:第七章 7.6 朴素贝叶斯检测对Apache的DDoS攻击