变量 = open(r'文件路径)','r[打开文件模式]',encoding='utf-8文本字符集[默认是unicode]')
win 需要在路径上加 r ,字符集跟文件写入的格式.
(1). 打开文件的模式有(默认为文本模式[test]):
r,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a,只追加写模式【不可读;不存在则创建;存在则只追加内容】
(2). 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb
wb
ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
(3),‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】--- 文件必须存在
w+,写读【可写,可读】 --- 文件没有存在,直接创建
a+, 写读【可写,可读】
(4),以bytes类型操作的读写,写读,写读模式
r+b, 读写【可读,可写】
w+b,写读【可写,可读】
a+b, 写读【可写,可读】
2. 操作方法
read
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。(先清空,在写)
写
w --模式写 光标先从头开始,先清空,在写
writable() ---判断文件是否可写 -- True/False
实例:
f=open(r'a.txt','w',encoding='utf-8')
print(f.writable())
f.close()
True
write() ---直接写,默认追加最后,每次都是从头在
实例:
f=open(r'a.txt','w',encoding='utf-8')
# print(f.writable())
f.write('1111
')
f.close()
1111
writelines() ---可以已列表,元祖,字典方式写入
f=open(r'a.txt','w',encoding='utf-8')
f.writelines(['3333
','44444
'])
f.close()
3333
44444
a ---模式追加 文件不存在则创建,文件存在那么打开文件后立刻将光标移动最后.
r ---读模式,必须文件存在
read.() ---文件全部读在内存中,建议小文件
readlines() ---文件全部读在内存中,但是放在列表中显示
readline(),end='' ---一次读一行,默认会带一个换行符,加上end='' 指定空
循环打印:
with open('b.txt','r',encoding='utf-8') sa f: #f 指定变量名字
for i in f:
print(i)
b ---bytes 二进制读,不能指定字符编码,解码文本格式加.decode('utf-8')
with open('b.txt','rb',) as f:
print(f.read().decode('utf-8'))
python cp 命令:
import 函数用于动态加载类和函数
os模块
os.remove(path)
删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。
os.rename(src, dst)
重命名文件或目录,从 src 到 dst
实例:
import os
with open('a.txt','r',encoding='utf-8') as f ,
open('.a.txt.swap','w',encoding='utf-8') as o:
# data = f.read()
# o.write(data.replace('alex','ALEX')) #方法一:只适合小文件
for i in f:
print(i)
o.write(i.replace('alex', 'ALEX'))
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
replace('旧','新',' 替换不超过 max 次(不在全部)')
split()
指定分隔符对字符串进行切片,如果参数 num 有指定值,则仅分隔 num 个子字符串
语法
split() 方法语法:
str.split(str="", num=string.count(str)).
参数
str -- 分隔符,默认为所有的空字符,包括空格、换行(
)、制表符( )等。
num -- 分割次数。
实例
以下实例展示了split()函数的使用方法:
#!/usr/bin/python
str = "Line1-abcdef
Line2-abc
Line4-abcd";
print str.split( );
print str.split(' ', 1 );
以上实例输出结果如下:
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', '
Line2-abc
Line4-abcd']
'''
1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
通过代码,将其构建成这种数据类型:
[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......]
并计算出总价钱。
'''
list_info = []
with open(r'b.txt','r',encoding='utf-8') as f:
for i in f:
list = i.split()
print(list)
list_info.append({'name':list[0],'price':int(list[1]),'count':int(list[2])})
# money = list(map(lambda x:x['price']*x['count'],list_info))
money = map(lambda x: x['price'] * x['count'], list_info)
ss = sum(money)
print('共消费 %d 元'%ss)
print(list_info)
2,有如下文件:
'''
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
'''
import os
with open('a.txt','r',encoding='utf-8') as f ,
open('.a.txt.swap','w',encoding='utf-8') as o:
# data = f.read()
# o.write(data.replace('alex','ALEX')) #方法一:只适合小文件
for i in f:
print(i)
o.write(i.replace('alex', 'ALEX'))
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
2. 控制光标移动
创建一个文件:a.txt
helli你好
with open('a.txt','r',encoding='utf-8') as f:
data1=f.read()
print(data1)
print(f.tell()) #告诉光标在什么位置,显示是以 字节
#只有一种情况下光标以字符为单位: 文件以rt方式打开,read(3)
#方法一:
f.seek(0)
#方法二: f.seek('移动的数','参照物,默认是0'),--只有t模式下,还可以使用0,1和2不可以
#有三种模式0,1,2 (0是首尾,1是当前的位置,2是以末尾)--1和2 必须在b 模式下使用
f.seek(0,0)
tail -f access.log
截断文件:
只能用a模式 ,如果使用w模式,直接清空
with open('access.log','a',encoding='utf-8') as f:
f.truncate(3) #没有0,1,2 全都是从头开始