; python文件操作 | Linux运维部落

python文件操作

文件操作使用的函数
open 打开
read 读
write 写
close 关
其他非常用的 seek 设置读取指针 tell 读取读取指针位置

windows中
def encode(self, encoding=’utf-8′, errors=’strict’)
open 和它的参数
open(file,mode=’r’,buffering=-1,encoding=None,errors=None,newline=None,closed=True,opener=None)
再mode的’r+’模式中
先读取 后写入会从最后面的地方开始写入
这是因为它的指针stat指在了最后的地方
设置seek 他会写入覆盖指针开始的地方,写玩后指针会在写完内容的后面的地方
‘w+’模式中
进入文件文件不论事先存在与否都会是一个空的文件,
‘a+’模式中
指针开始的地方就在最后,读取不到东西,设置指针seek可以读取到内容
写入内容后都不能够再读取,因为a写入的内容都是追加的,指针在最后面
‘x+’模式
进入的文件是空的,先写入后面才可以读取,
写模式中它的它从seek指针所在位置开始写入

总结:读取文件从指针位置读取,读写文件后在读或者写的最后的地方是指针的位置,’a’模式中进入时就在最后写入时是往最后面追加

 

buffering 缓存模式对于 t文本和b字节有差别
默认 -1 都是默认内存容量
0 b关闭缓存,t无法使用
1 b就是1个字节, t使用到了换行符就缓存
>1 b设置缓冲区大小,t 没明显效果在达到默认的缓存大小时依然能缓存
测试:
设置seek,tell时也会导致缓存内容缓存
如果一个文件多个线程访问时,也会造成内容缓存

在linux中
from pathlib import Path
p = Path()
type(p)
>>pathlib.PosixPath
p
>>posixPath(‘.’)
p.absolute()
>>PosixPath(‘/home/python/magedu/projects/cmdb’)

在Windows中
from pathlib import Path
p = Path()
type(p)
>>pathlib.WindowsPath
p
>>WindowsPath(‘.’)
p.absolute()
>>WindowsPath(‘C:/Users/Administrator’)

 

p = p.joinpath(‘a’,’b’)
p.absolute()
>>PosixPath(‘/home/python/magedu/projects/cmdb/a/b’)
p = p/’c’/’d’ 相当于 p /=’c’/’d’
p
>>PosixPath(‘a/b/c/d’)

p=Path() #当前目录
p=Path(‘a’,’b’,’c/d’) #当前目录下面的a/b/c/d目录
p=Path(‘/etc’) #根下的etc目录

不论Linux,windows ‘/’不需要转义 ‘\’需要转义

p.parent 目录的一个属性返回它的父目录

list(p2.parents) p2目录更高级的目录的列表
[PosixPath(‘/etc’),PosixPath(‘/’)]

p = Path() 不同于字符串的专门的对象,它的方法字符串都不能使用

 

os模块
os.listdir(‘o:/temp’) 返回目录内容列表
os.stat(path,*,dir_fd=None,follow_symlinks=True) 显示文件或目录的标志信息
os.stat_result(st_mode=33206, st_ino=3096224743941554, st_dev=305849394, st_nlink=1, st_uid=0, st_gid=0, st_size=12, st_atime=1508808655, st_mtime=1509154651, st_ctime=1508808655)

os.chmod(path,mode,*,dir_fd=None,follow_symlinks=True)
os.chmod(‘test.txt’,0o777)

os.chown(path,uid,gid)

shutil模块 复制 删除 移动
copyfile(src,dst,*,follow_symlinks=True)
copyfileobj(fsrc,fdst[,length])
src和dst 必须是表示路径的字符串 length指定buffer的大小,必须对src可读dst可写
fsrc,fdst 必须是open打开的文件类型
它们的原来的权限设置不会改变
copymode(src,dst,*,follow_symlinks=True) 仅仅复制权限

基本数据类型中列表和字典,bytearray都有.copy()方法
copy(src,dst,*,follow_symlinks=True) 底层调用了copyfile和copymode
copy2(src,dst,*,follow_symlinks=True) 底层调用了copyfile和copystat

copytree(src,dst,symlinks=False,ignore=None,copy_function=copy2,ignore_dangling_symlinks=False)
递归复制整个目录,文件直接拷贝,软连接默认直接引用,
ignore= func ,提供一个callable(src,names)->ignored_names.names是os.listdir(src)的结果,
# o:/temp下有a,b目录
def ignore(src,name):
ig = filter(lambda x: x.startswith(‘a’),names) # 忽略a 类型的文件
return set(ig)
shutil.copytree(‘o:/temp’,’O:/tt/o’,ignore=ignore)
– 普通文件
d 目录文件
b 块设备文件
c 字符设备文件
l 符号链
p 管道特殊文件

rm删除
shutil.rmtree(path,ignore_errors=False,onerror=None) 递归删除,非原子操作,

move移动
move(src,dst,copy_function=copy2)
递归移动文件,目录到目标,返回目标
底层使用的是os.rename方法

csv 文件,是一种文件类型
生成一个csv类型的文件需要 指定一个.csv的文件路径
写入一个有行分隔符和列分隔符的字符串
行分隔符\r\n 列分割符常为逗号

读取一个csv文件,要引入csv模块
reader(csvfile,dialect=’excel’,**fmtparams) #返回一个迭代器是DictReader的实例

import csv
p = Path(‘o:/tmp/mycsv/test.csv’)
with open(str(p)) as f:
reader = csv.reader(f)
print(next(reader))
print(next(reader))

 

row = [4,’tom’,22,’tom’]
rows = [
(5,’jerry’,24,’jerry’),
(6,’justin’,22,’just\t”in’)
]
writer(csvfile,dialect=’excel’,**fmtparams) #返回DictWriter的实例

with open(str(p),’a+’) as f:
writer = csv.writer(f)
writer.writerow(row)
writer.writerrows(rows)

4 tom 22 tom
5 jerry 24 jerry
6 justin 22 just ”

 

ini文件 作为配置文件,它很流行
使用configparser配置解析器 这个模块来对它操作
from configparser import ConfigParser
#读取一个.ini文件
cfg = ConfigParser()
cfg.read(‘mysql.ini’) #指明路径
cfg有.sections方法 和.items([section])方法如果知道其中的section名称可以获取
section 的键值对 ,没有参数可以返回一个迭代器

 

serialization 序列化
将内存中对象存储下来,把它变成一个个字节
deserialization 反序列化
字节恢复成内存中对象
每一种高级语言都有自己的序列化的实现

from pathlib import Path
import pickle
写入
pickle.dump(存储对象,文件打开对象) #在文件中操作的
pickle.dumps() #在内存中操作

lst = ‘a b c’.split()
d = dict(zip(‘abc’,range(3))
with open(‘o:/bin’,’wb’) as f:
pickle.dump(lst,f)
pickle.dump(d,f)

with open(‘o:/bin’,’rb’) as f:
tmp = pickle.load(f)
print(tmp)
tmp = pickle.load(f)
print(tmp)
输出结果
[‘a’,’b’,’c’]
{‘a’:0,’b’:1,’c’:2}

class AA()
def show()
…….
aa =AA()
with open(‘o:/bin’,’wb’) as f:
pickle.dump(aa,f) # 对象aa写入文件

with open(‘o:/bin’,’rb’) as f:
tmp= pickle.load(f)
print(type(tmp)) =>输出<class ‘test.AA’>
tmp.show() 可以调用类对象里面的方法

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:/88169

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐登录  guoqibee.com  万达招商QQ  华宇招商  guoqibee.com  万达主管QQ  万达娱乐直属QQ  万达主管QQ  万达娱乐招商  万达开户