首页 > 代码库 > 10-文件管理

10-文件管理

文件打开--读取--关闭:
f = open(‘path/to/path‘) :可以相对路径或绝对路径
print(f)   :打印获取到的文件句柄信息,而非文件内容
data = http://www.mamicode.com/f.read() :根据文件句柄信息,读取内容,将读取到的内容赋值给变量data
print(data)   :打印变量就相当于打印文件内容
f.close()
 
open打开文件,如果不指定打开的编码格式,则会使用所在平台的编码格式为默认打开格式
open(‘path/to/path‘, ‘r‘, encoding=‘utf-8‘)
- ‘path/to/path‘:读取的文件,相对路径或绝对路径
- ‘r‘:指定对文件打开时用什么方法,不指定默认为只读r,r只读,r+读写,w写,w+写读,a追加,a+追加读
- encoding=‘utf-8‘:指定以什么编码读取文件
 
with...as...:自动打开文件并自动关闭
with open(‘a.txt‘, ‘r‘, encoding=‘utf-8‘) as f1, open(‘b.txt‘, ‘r‘, encoding=‘utf-8‘) as f2:
    print(f1.read())
    print(f2.read())
 
读:
f = open(‘a.txt‘, ‘r‘, encoding=‘utf-8‘)
从打开到关闭这段过程中,要注意读取文件时,光标所在位置
比如,第一次read时,光标从文件内容开头位置(即0位置),一直到末尾全部读取完毕,光标则会定位在末尾处,如果这时文件没有被关闭,而是又开始读取,那么就会从光标所在位置继续读取,结果自然是什么内容也读不到;
f = open(a.txt, encoding=utf-8)
data = f.read()
print(data)
print(data2------------->)
data2 = f.read()
print(data2)
运行结果:
hello,world.
what is your name?
how are you?
data2------------->

 

写:
f = open(‘a.txt‘, ‘w‘, encoding=‘utf-8‘)
-有文件则对其内容清空
-没有则创建
 
方法:
.write(‘1111111\n22222‘):写入
.writelines([]):写入一个列表
 
一个示例:
要求:
有一个文件a.txt,内容如下:
111111111111
22222222222222
333333333333
4444444444444
555555555555555
请将444444444444全部转换成ddddddddddddd
import os
read_f = open(a.txt, r, encoding=utf-8)
write_f = open(b.txt, w, encoding=utf-8)
for line in read_f.readlines():
    if line.startwith(4444444444):
        line = dddddddddddd\n
    write_f.write(line)
read_f.close()
write_f.close()
os.remove(a.txt)
os.rename(b.txt, a.txt)

 

‘rb‘方式:
以bytes格式读取文件,读取到的内容以bytes格式显示
如a.txt内容为‘你好’
with open(a.txt, rb) as f:
    print(f.read())
运行结果:
b\xe4\xbd\xa0\xe6\x98\xaf\xe8\xb0\x81
with open(a.txt, rb) as f:
    print(f.read().decode(utf-8))
运行结果:
你好

 

‘wb‘方式:
以bytes格式写入内容到文件,写入的内容是二进制bytes格式
如写入内容为二进制格式的‘你好吗’到c.txt中
with open(c.txt, wb) as f:
    f.write(你好吗.encode(utf-8))

查看c.txt文件内容为‘你好吗’

 
 
文件控制方法:
.seek(n):指定光标移动到第n个字节位置(以开头为标准,后移n个字节)
f.seek(0)表示让光标移动到内容开头
f = open(a.txt, encoding=utf-8)
data = f.read()
print(data)
print(data2------------->)
f.seek(0)
data2 = f.read()
print(data2)
运行结果:
hello,world.
what is your name?
how are you?
data2------------->
hello,world.
what is your name?
how are you?

f.seek(2, 1):代表以当前光标所在的位置开始,往后移动2个bytes,仅在b模式打开时可用

f.seek(-2,2):代表以末尾为起始位置,往前移动2个bytes,注意隐藏的换行符或制表符也要算一个字节
 
对文件其他的方法:
.close():文件关闭
.readline():一次读一行
.readlines():读取所有,以每行为一个元素,保存为一个列表
.tell():获取当前光标所处位置
.truncate(n):截断文件,n表示截取n个字节(二进制)
with open(c.txt, r+, encoding=utf-8) as f:
    f.truncate(3)
运行结果:
查看c.txt文件内容
你

 

一个示例:
要求:监控一个文件access.log的内容,如果有新内容,则提示出来:
import time
with open(access.log, r, encoding=utf-8) as f:
    f.seek(0, 2)
    while True:
        line = f.readline().strip()
        if line:
            print(新增:, line)
        time.sleep(1)

 

 

10-文件管理