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

相关推荐

  • 计算机基础及Linux基础

    计算机基础与Linux入门 计算机组成及功能 Linux常见发行版 Linux重要哲学思想 Linux文件系统层级结构及文件命名规则 如何获取Linux命令的使用帮助 Linux常用命令及示例 1.1 计算机组成及功能 1.1.1 计算机的五大部件 计算机的主要组成部分有: 1、CPU:运算器 2、控制器、寄存器(内部存储)、缓存; 3、存储器:内存,RAM…

    Linux干货 2016-12-04
  • ansible配置与应用

    无法上传图片 一、程序主要文件: ansible ansible-playbook ansible-doc 二、程序发布: 要求: 1.不能影响用户体验 2.系统不能停机 3.不能导致系统故障或造成系统完全不可用。 发布路径: /webapps/tuangou /webapps/tuangou-1.1 /webapps/tuangou-1.2. 在调度器上下…

    Linux干货 2016-11-14
  • 转载:UEFI和BIOS对比

    传统BIOS开机流程     从你按下主机机壳上的电源键,到进入作业系统的期间,储存于主机板上那颗EEPROM(电气可抹除暨可程式化唯读记忆体)里的BIOS便会开始执行以下的工作: 1. 初始化:     当电脑打开,CPU会自行重置为初始状态,准备运作。BIOS boot block(基本输出输入…

    Linux干货 2016-05-01
  • 第一周作业-01

    计算机组成    硬件:主要由5大部件组成,CPU包含运算器和控制器两大部件        CPU:运算器、控制器、寄存器、缓存        存储器:内存,RAM(Random Access Memory)    , Memory只支持平…

    Linux干货 2016-09-10
  • 文本处理工具sed、vim

    文本处理工具sed、vim 一、sed的使用 1、sed的概念 sed简单地说sed是一种行处理工具。 sed 是一种流性的行编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末…

    Linux干货 2016-08-11
  • Linux的文件权限(一)

    Linux的文件权限 在Linux的世界里,一切皆文件,用文件代表了系统的所有数据。既然文件那么重要,自然会给文件赋予一定的权限,要不然每个人都可以乱来,那系统会十分危险。所以文件的所有者会给文件设定权限,每个用户在自己权限的范围下做各自的操作。 我们可以先用 ll-d 查看一下文件的权限 第一位代表着问价类型,d 代表着是目录文件,后面九位代表着权限。其中…

    2017-05-30