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运维部落立场,如若转载,请注明出处:http://www.178linux.com/88169

(0)
daishitongdaishitong
上一篇 2017-10-30 20:16
下一篇 2017-10-31 14:48

相关推荐

  • IP地址的划分及优化

    IP地址定义:互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,所以它可以唯一标识IP网络中的每台设备,同时没台主机(计算机,网络设备,外围设备)必须具有唯一的地址。 IP地址相比于MA…

    Linux干货 2017-07-02
  • 第八周 服务管理与文本处理

    1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理 2、描述awk命令用法及示例(至少3例) 3、描述awk函数示例(至少3例)    

    2018-01-21
  • HSRP vs VRRP

    HSRP:(Hot Standby Router Protocol)-热备份路由协议 是cisco平台一种特有的技术,是cisco的私有协议。 VRRP:(Virtual Router Redundancy Protocol)-虚拟路由冗余协议 是国际标准,由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议。 ----------------…

    Linux干货 2016-10-19
  • 第三周作业

    第三周  文本处理工具:             linux上文本处理三剑客:                      grep、egrep、fgrep:文本过滤工具(模式pat…

    Linux干货 2016-12-18
  • 超文本传输协议-HTTP

        超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。     设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或…

    Linux干货 2017-07-31
  • 文件通配符练习

    课后资料补充 * : 通配符,代表任意字符(0到多个)? : 通配符,代表一个字符# : 注释/ : 跳转符号,将特殊字符或通配符还原成一般符号| : 分隔两个管线命令的界定; : 连续性命令的界定~ : 用户的根目录$ : 变量前需要加的变量值! : 逻辑运算中的&q…

    Linux干货 2016-08-08