Python进阶5---StringIO和BytesIO、路径操作、OS模块、shutil模块
StringIO

StringIO操作


BytesIO

BytesIO操作

file-like对象

路径操作
路径操作模块
3.4版本之前:os.path模块

3.4版本开始
建议使用pathlib模块,提供Path对象来操作。包括目录和文件
pathlib模块
from pathlib import Path
目录操作
初始化

路径拼接和分解

#在windows下的Pycharm中运行
p = Path()
print(type(p)) #<class 'pathlib.WindowsPath'>
p = p / 'a'
print(p) #a
p1 = 'b' / p
print(p1) #b\a
p2 = Path('c')
p3 = p2 / p1
print(p3) #c\b\a
print(p3.parts) #('c', 'b', 'a')
print(p3.joinpath('etc','init.d',Path('httpd'))) #c\b\a\etc\init.d\httpd

p = Path('/etc')
print(str(p),bytes(p))

p = Path('/a/b/c/d')
print(p.parent.parent)
for x in p.parents:
print(x)

#四个属性,两个方法
p = Path('E:\learnshare\ArticleSpider\e.xex.txt')
print(p.name) #e.xex.txt
print(p.stem) #e.xex
print(p.suffix) #.txt
print(p.suffixes) #['.xex','.txt']
print(p.with_name('c.y'))#E:\learnshare\ArticleSpider\c.y
print(p.with_suffix('.xxyy'))#E:\learnshare\ArticleSpider\e.xex.xxyy



调用iterdir()方法后返回一个生成器对象



通配符
glob(pattern)通配给定的模式
rglob(pattern)通配给定的模式,递归目录
from pathlib import Path
print(1,list(Path().glob('test*')))#返回当前目录对象下的test开头的文件
print(2,list(Path().glob('*/test*')))#返回当前目录的下一级目录以test开头的文件
print(3,list(Path().glob('**/test*')))#递归当前目录以及其下所有目录,返回以test开头的文件
print(4,list(Path().rglob('test*')))#同上一样
匹配
match(pattern)
模式匹配,成功返回True

文件操作



OS模块


fd表示文件描述符


shutil模块
到目前为止
文件拷贝:使用打开2个文件对象,源文件读取内容,写入目标文件中来完成拷贝过程。但是这样会丢失stat数据信息(权限等),因为根本就没有复制过去。
目录怎么办呢?
Python提供了一个方便的库shutil(高级文件操作)
Copy复制

import shutil
with open('test1.txt','r+') as f1:
f1.write('abcd\n1234')
f1.flush()
with open('test2.txt','w+')as f2:
shutil.copyfileobj(f1,f2)
#注意:由于指针的缘故,可参见源码如下。上述代码中abcd\n1234内容确实会写入到test1.txt,但是并没有复制到test2.txt中。
#copyfileobj源码
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)







#copytree源码,这里主要了解一下ignore函数的使用技巧,过滤掉不需要拷贝的!
def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
names = os.listdir(src)
if ignore is not None:
ignored_names = ignore(src, names)
else:
ignored_names = set() os.makedirs(dst)
errors = []
for name in names:
if name in ignored_names:
continue
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
...return dst
def fn(src,file_names):
filter(lambda x:x.startwith('t'),file_names)
#上面的语句等同于下面的语句
fn = lambda src,names:filter(lambda x:x.startwith('t').file_names)
#filter(function, iterable)
#注意: Pyhton2.7 返回列表,Python3.x 返回迭代器对象
#假设D:/temp下有a,b目录
def ignore(src,names):
ig = filter(lambda x:x.startwith('a'),names) #忽略a
return set(ig) shutil.copytree('o:/temp','o:/tt/o',ignore=ignore)
rm删除

shutil.rmtree('D:/tmp') #类似rm -rf
move移动

#在同一盘符下,其实质上就是rename,跨盘符的话才是真正的移动
os.rename('D:/temp/x.txt','D:/t.txt')
os.rename('test3','/tmp/py/test')

shutil对压缩包的处理是调用ZipFile和ZipFile两个模块来处理的
参考:https://www.cnblogs.com/zjltt/p/6957663.html
csv文件
csv文件简介(文本格式,半结构化数据)

手动生成CSV文件
from pathlib import Path
p = Path('F:\\百度网盘下载资料\\Python全栈开发\\python进阶1\\19Python的文件IO(三)(6)\\test.csv')
parent = p.parent
if not parent.exists():
parent.mkdir(parents=True)
csv_body = '''\
id,name,age,comment
1,zs,18,"I'm 18"
2,ls,20,"This is a testing"
3,ww,232,"中 国"
'''
p.write_text(csv_body)
csv模块

from pathlib import Path
import csv
p = Path('F:\\test.csv')
with open(str(p)) as f:
reader = csv.reader(f)
print(next(reader)) row = [4,'cty',22,'tom']
rows = [
(1,'',3,''),
(11,'',22,"\"123123")
]
with open(str(p),'a+') as f:
writer = csv.writer(f)
writer.writerow(row)
writer.writerows(rows)
ini文件
作为配置文件,ini文件格式很流行

中括号里面的部分称为section。
每一个section内,都是key=value形成的键值对,key称为option选项。
configparser




from configparser import ConfigParser cfg = ConfigParser()
cfg.read('mysql.ini')
print(cfg.sections())
print(cfg.has_section('deploy'))
print(cfg.items('deploy')) for k,v in cfg.items('deploy'):
print(k,type(v)) tmp = cfg.get('deploy','a')
print(tmp,type(tmp))
print(cfg.get('deploy','a',fallback='python')) print(cfg.getint('mysql','aa')) if cfg.has_section('mysql'):
cfg.remove_section('mysql') cfg.add_section('cy')
cfg.set('cy','ly','')
cfg.set('cy','ggz','') # 上面的删除和新增功能需要重新写入文件才会生效
with open('mysql.ini','w') as f:
cfg.write(f) print(cfg.getint('cy','ggz'))
print(cfg.remove_option('cy','ly')) with open('mysql.ini','w') as f:
cfg.write(f)
注意:配置文件一般加载后常驻于内存中,且读取操作远远多于写入操作。
Python进阶5---StringIO和BytesIO、路径操作、OS模块、shutil模块的更多相关文章
- 【Python初级】StringIO和BytesIO读写操作的小思考
from io import StringIO; f = StringIO(); f.write('Hello World'); s = f.readline(); print s; 上面这种方法“无 ...
- Python入门篇-StringIO和BytesIO
Python入门篇-StringIO和BytesIO 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringIO(用于文本处理) 1>.使用案例 #!/usr/bin ...
- Python中os和shutil模块实用方法集…
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- Python中os和shutil模块实用方法集锦
Python中os和shutil模块实用方法集锦 类型:转载 时间:2014-05-13 这篇文章主要介绍了Python中os和shutil模块实用方法集锦,需要的朋友可以参考下 复制代码代码如下: ...
- python day 9: xlm模块,configparser模块,shutil模块,subprocess模块,logging模块,迭代器与生成器,反射
目录 python day 9 1. xml模块 1.1 初识xml 1.2 遍历xml文档的指定节点 1.3 通过python手工创建xml文档 1.4 创建节点的两种方式 1.5 总结 2. co ...
- 【Python】[IO编程]文件读写,StringIO和BytesIO,操作文件和目录,序列化
IO在计算机中指Input/Output,也就是输入和输出. 1.文件读写,1,读文件[使用Python内置函数,open,传入文件名标示符] >>> f = open('/User ...
- python IO编程-StringIO和BytesIO
链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319187857 ...
- python 文件,文件夹,路径操作
判断路径或文件os.path.isabs(...) # 判断是否绝对路径os.path.exists(...) # 判断是否真实存在os.path.isdir(...) # 判断是否是个目录os.pa ...
- day18 时间:time:,日历:calendar,可以运算的时间:datatime,系统:sys, 操作系统:os,系统路径操作:os.path,跨文件夹移动文件,递归删除的思路,递归遍历打印目标路径中所有的txt文件,项目开发周期
复习 ''' 1.跨文件夹导包 - 不用考虑包的情况下直接导入文件夹(包)下的具体模块 2.__name__: py自执行 '__main__' | py被导入执行 '模块名' 3.包:一系列模块的集 ...
- 路径操作OS模块和Path类(全)一篇够用!
路径操作 路径操作模块 os模块 os属性 os.name # windows是nt, linux是posix os.uname() # *nix支持 sys.platform #sys模块的属性, ...
随机推荐
- [PHP]命令执行函数的区别
<?php $cmd="ps aux|grep php-fpm"; $res=exec($cmd,$o); var_dump($o);//数组形式返回,每行一个元素 var_ ...
- win10 git bash 闪退
使用ghost重装了win10 专业版后.安装git,尝试重装了n个版本的git,右键git bash here 直接闪退,直接进入安装目录打开git-bash.exe依旧闪退, git右键点击Git ...
- Java学习笔记之——LinkedList
LinkedList 底层结构:链表 1. API: 除了ArrayList中有的方法以外,LinkedList还有几个扩展方法 void addFirst(E e) 在该列表开头插入指定的元素. v ...
- mybatis基础(中)
数据模型分析思路 每张表记录的数据内容 分模块对每张表记录对内容进行熟悉,相当于学习系统需求(功能)的过程 每张表重要的字段设置 非空字段.外键字段 数据库级别表与表之间的关系 外键关系 表与表之间的 ...
- jsp内置对象的作用范围
内置对象的作用范围是指每个内置对象的某个实例在多长时间和多大的范围中有效,即在什么样的范围内可以有效地访问同一个对象实例. 在javax.servlet.jsp.PageContext的类中定义了4个 ...
- 第五课 Css3旋转放大属性,正六边形的绘制
---恢复内容开始--- 一.效果 二.知识点 1.background-color: rgba(0,0,0,.4); (红色.绿色.蓝色.透明度(0-1)) 2.position: absolu ...
- react create-react-app 跨域
"proxy":"http://youAddr.com" 直接到根目录package.json里增加上面这行就行了,改成自己需要的地址.
- python运行逻辑
Python程序在解释器上执行分两个过程: 编译:如果Python进程在机器上拥有写入权限,那么它会把程序的字节码保存为一个以 .pyc 为扩展名的文件.当程序运行后,会在源代码的同一个目录下看到 . ...
- loj#2531. 「CQOI2018」破解 D-H 协议(BSGS)
题意 题目链接 Sol 搞个BSGS板子出题人也是很棒棒哦 #include<bits/stdc++.h> #define Pair pair<int, int> #defin ...
- 小记 xian80 坐标转换 wgs84
转坐标这个问题是个老生常谈的话题了. 昨天遇到同事求助将 xian80的平面坐标转换到2000下. 想了一下,因为暂时还没有现成的2000的dwg数据可用,只能暂时以wgs84的为准了,然而有个问题, ...