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
下一篇 2017-10-31

相关推荐

  • N25-第四周

    复制/etc/ske1目录为/home/tuser1,要求/home/tuser及其内部文件的属组和其他用户均没有任何访问权限。 [root@localhost ~]# cp -a /etc/skel/ /home/tuser1[root@localhost ~]# ll -d /home/tuser1/drwxr-xr-x. 2 root root 59 …

    Linux干货 2016-12-25
  • 马哥教育网络班22期第6周课程作业

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; %s@^[[:space:]]\+@# 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符; %…

    Linux干货 2016-12-05
  • 无痛之ext3升ext4[原创]

    一台文件存储服务器单目录下子目录已经突破31998数限制,造成无法继续创建子目录,服务器系统环境为CentOS5.4 内核版本为2.6.18。解决方案只能是升级到ext4文件系统,首先到https://ext4.wiki.kernel.org/index.php/Ext4_Howto查了一下资料,文中的第一句便是“Ext4 was released as a…

    Linux干货 2015-03-27
  • 小练习题。【第四周】

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其他用户均没有任何访问权限。 home]# chmod g-rwx,o-rwx -R tuser1 2、编辑/etc/group文件,添加组hadoop。 /]# vim /etc/group …

    Linux干货 2016-11-26
  • 马哥教育网络班20期第2周课程练习

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关  示例演示。 linux上文件管理命令包括: ls,cat,pwd,cp,rm,cd,head,tail,more,less,cut,which,whereis,find,mkdir,mv; 1、ls 命令;显示文件/文件夹清单   例如:如下显示列出根目录下的文件及目录…

    Linux干货 2016-06-23
  • Linux基础知识点(一)

    此篇博客只是记录第一周未掌握或不熟悉的知识点,用来加深印象。

    2018-03-13