python初学--文件操作、字典
文件读写
1、先打开文件
2、读取/写入内容
3、保存文件
文件的open模式有三种
1、w 写模式,它是不能读的 只要用w打开文件,文件中的东西都会被清空
w+, 写读模式,只要沾上w 就会清空原来的文件
2、r 读模式,只能读,不能写,而且文件必须存在
r+ 读写模式,只要沾上r 文件必须存在 不存在就会报错
3、a 追加模式,也能写 这种模式,打开文件后直接定位到文件的末尾,然后开始追加,所以会用到 .seek(0)得方法
a+
rb+ wb+
f=open('a.txt222','a+',encoding='utf-8')
f.seek(0) #a+模式,指针定位在末尾,使用.seek(0)可以将指针定位带最前面
print(f.read()) #read:返回的是字符串 读取的是整个文件 效率低
print(f.readlines()) #readlines:返回的是一个列表 通常用来读取配置文件 read和readlines读取的是整个文件 效率低
f.seek(0)
print(f.readline()) #readline方法:返回的是字符串 每次只读取一行数据 效率高
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
f=open(‘a.txt’)
如果在打开文件的时候不指定模式,那就是默认读模式
f=open('a.txt','r',encoding='utf-8')
print(f.read())
#直接循环的时候循环的是文件的每一行 比read和readlines的效率高些
count=1
for line in f:
print('第%s行:%s'%(count,line))
count+=1
--------------------------------------------------------------
write #写文件的的时候,只能是写字符串
f.writelines(['123','456','789']) #可以吧列表写到里头 list每个元素是文件的每一行
# f.write('jmysdfsdf')#write是写内容,只能写字符串
调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用
三、用linecache读取文件内容(测试过1G大小的文件,效率还可以)
str = linecache.getlines(filename)
str为列表形式,每一行为列表中的一个元素
------------------------------------
其他操作:
f = open('file.txt','r+',encoding='utf-8')#encoding参数可以指定文件的编码
f.readline()#读一行
f.readable()#判断文件是否可读
fr.writable()#判断文件是否可写
fr.encoding#打印文件的编码
f.read()#读取所有内容,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
f.readlines()#读取所有文件内容,返回一个list,元素是每行的数据,大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
f.tell()#获取当前文件的指针指向
f.seek(0)#把当前文件指针指向哪
f.write('爱情证书')#写入内容
f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中
f.truncate()#清空文件内容 只清空指针之后得文件内容 所以一般需要用到f.seek(0)
f.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置
f.writelines(['爱情证书','孙燕姿'])#将一个列表写入文件中
f.close()关闭文件
--------------------------------------------------------------------
文件操作练习题:
二、文件操作方法大全:
1.os.mknod("test.txt") #创建空文件
2.fp = open("test.txt",w) #直接打开一个文件,如果文件不存在则创建文件
3.关于open 模式:
fp.read([size]) #size为读取的长度,以byte为单位
fp.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分
fp.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
fp.write(str) #把str写到文件中,write()并不会在str后加上一个换行符
fp.writelines(seq) #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
fp.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
fp.flush() #把缓冲区的内容写入硬盘
fp.fileno() #返回一个长整型的”文件标签“
fp.isatty() #文件是否是一个终端设备文件(unix系统中的)
fp.tell() #返回文件操作标记的当前位置,以文件的开头为原点
fp.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
fp.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
fp.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
--------------------------------------------------------------------
# 1.打开一个文件
#2、读取整个文件,返回字符串
#3、读取一行
#4、读取整个文件,返回列表
#5、写入字符串
#6、写入非int类型的列表
# 7.清空文件
# 8.关闭文件
****************************************************************************
字典:
字典(1、字典是无序的 2、key:value #key不能重复)
info={
'name':'lzc',
'sex':'nan',
}
(一)查询
print(info)
print(info['name'])
print(info['addr'])
print(info.get('addr','没有取到值'))
1、用中括号和get取值的方法区别,如果get方法取不到key时,不会报错,但是中括号取值不到就会报错
2、get方法还可多传一个参数,如果get不到值key的话,那么返回xx,如果不写默认返回none
(二)添加
1、info['addr']='beijing'
print(info)
2、info.setdefault('phone',123243444)
print(info)
(三)修改
info['age']=7 #有这个字段的时候是修改 没有这个字段的的时候是新增
print(info)
(四)删除
1、del info['age']
print(info)
2、print(info.pop('name')) #必须要指定key 返回的是删除的字段的值
3、info.clear() 清空字典
4、info.popitem() 随机删除一个元素
请务必注意,dict内部存放的顺序和key放入的顺序是没有关系的。
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
需要牢记的第一条就是dict的key必须是不可变对象
这是因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key:
字典键的特性
字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行
1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住
2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行
----------------------------------------------------------------
字典练习:
user={'name':'niuhany','age':18}
#字典取值的方式1 方式2
# print(user['name'])
# print(user.get('name'))
# 字典修改值方式1 方式2
# user['name']='lzc'
# user.update(name='haha')
# print(user)
# 给字典增加值的方式1 方式二
# user['addr']='huilongguang'
# user.setdefault('sex','nan')
# print(user)
# 删除值的方式1,方式2 删除随机值
# del user['name']
# user.pop('age')
# user.popitem()
# print(user)
print(user.items())
for k,v in user.items(): #同时循环k和value
print("%s=%s"%(k,v))
for k in user:
print("%s=%s"%(k,user[k]))
# 判断一个字典在不在字典里面
user={'name':'lzc',
'aes':'nan'}
if 'name' in user:
print(True)