python有架构师吗_运维架构师-Python 自动化运维开发-021

*运维架构师-Python 自动化运维开发-021

十、文件操作

4、Python里的目录

所有文件都包含在各个不同的目录下,不过Python也能轻松处理。os模块有许多方法能帮你创建,删除和更改目录。

1、mkdir()方法

可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。

语法:

os.mkdir("newdir")

例子:

下例将在当前目录下创建一个新目录test。

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import os

# 创建目录test

os.mkdir("test")

2、chdir()方法

可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。

语法:

os.chdir("newdir")

例子:

下例将进入"/home/newdir"目录。

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import os

# 将当前目录改为"/home/newdir"

os.chdir(r"/home/newdir")

3、getcwd()方法

getcwd()方法显示当前的工作目录。

语法:

os.getcwd()

例子:

下例给出当前目录:

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import os

# 给出当前的目录

print os.getcwd()

4、rmdir()方法

rmdir()方法删除目录,目录名称以参数传递。

在删除这个目录之前,它的所有内容应该先被清除。

语法:

os.rmdir('dirname')

例子:

以下是删除" /tmp/test"目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。

#!/usr/bin/python

# -*- coding: UTF-8 -*-

import os

# 删除”/tmp/test”目录

os.rmdir( r"/tmp/test" )

5、文件具体操作(附加练习)

f = open('小重山') #打开文件

data1=f.read() #获取文件内容

data2=f.read() #获取文件内容

print(data1)

print('...',data2)

data=f.read(5) #获取文件内容

data=f.readline()

data=f.readline()

print(f.__iter__().__next__())

for i in range(5):

print(f.readline())

data=f.readlines()

for line in f.readlines():

print(line)

# 问题来了:打印所有行,另外第3行后面加上:'end 3'

for index,line in enumerate(f.readlines()):

if index==2:

line=''.join([line.strip(),'end 3'])

print(line.strip())

#切记:以后我们一定都用下面这种

count=0

for line in f:

if count==3:

line=''.join([line.strip(),'end 3'])

print(line.strip())

count+=1

print(f.tell())

print(f.readline())

print(f.tell()) #tell对于英文字符就是占一个,中文字符占三个,区分与read()的不同.

print(f.read(5)) #一个中文占三个字符

print(f.tell())

f.seek(0)

print(f.read(6)) #read后不管是中文字符还是英文字符,都统一算一个单位,read(6),此刻就读了6个中文字符

# terminal上操作:

f = open('小重山2','w')

f.write('hello\n')

f.flush()

f.write('world')

# 应用:进度条

import time,sys

for i in range(30):

sys.stdout.write("*")

sys.stdout.flush()

time.sleep(0.1)

f = open('小重山2','w')

f.truncate() #全部截断

f.truncate(5) #全部截断

print(f.isatty())

print(f.seekable())

print(f.readable())

f.close() #关闭文件

接下来我们继续扩展文件模式:

f = open('小重山2','w') #打开文件

f = open('小重山2','a') #打开文件

f.write('莫等闲1\n')

f.write('白了少年头2\n')

f.write('空悲切!3')

f.close()

#r+,w+模式

f = open('小重山2','r+') #以读写模式打开文件

print(f.read(5))#可读

f.write('hello')

print('------')

print(f.read())

f = open('小重山2','w+') #以写读模式打开文件

print(f.read(5)) #什么都没有,因为先格式化了文本

f.write('hello alex')

print(f.read()) #还是read不到

f.seek(0)

print(f.read())

#w+与a+的区别在于是否在开始覆盖整个文件

# ok,重点来了,我要给文本第三行后面加一行内容:'hello 岳飞!'

# 有同学说,前面不是做过修改了吗? 大哥,刚才是修改内容后print,现在是对文件进行修改!!!

f = open('小重山2','r+') #以写读模式打开文件

f.readline()

f.readline()

f.readline()

print(f.tell())

f.write('hello 岳飞')

f.close()

# 和想的不一样,不管事!那涉及到文件修改怎么办呢?

f_read = open('小重山','r') #以写读模式打开文件

f_write = open('小重山_back','w') #以写读模式打开文件

count=0

for line in f_read:

if count==3:

f_write.write('hello,岳飞\n')

else:

f_write.write(line)

another way:

if count==3:

line='hello,岳飞2\n'

f_write.write(line)

count+=1

#二进制模式

f = open('小重山2','wb') #以二进制的形式读文件

f = open('小重山2','wb') #以二进制的形式写文件

f.write('hello alvin!'.encode())#b'hello alvin!'就是一个二进制格式的数据,只是为了观看,没有显示成010101的形式

注意1: 无论是py2还是py3,在r+模式下都可以等量字节替换,但没有任何意义的!

注意2:有同学在这里会用readlines得到内容列表,再通过索引对相应内容进行修改,最后将列表重新写会该文件。这种思路有一个很大的问题,数据若很大,你的内存会受不了的,而我们的方式则可以通过迭代器来优化这个过程。

6、补充:rb模式以及seek (附加练习)

在py2中:

#昨夜寒蛩不住鸣.

f = open('test','r',) #以写读模式打开文件

f.read(3)

f.seek(3)

print f.read(3)

f.seek(3,1)

print f.read(3)

f.seek(-4,2)

print f.read(3)

在py3中:

# test:

昨夜寒蛩不住鸣.

f = open('test','rb',) #以写读模式打开文件

f.read(3)

f.seek(3)

print(f.read(3))

b'\xe5\xa4\x9c'

f.seek(3,1)

print(f.read(3))

b'\xe5\xaf\x92'

f.seek(-4,2)

print(f.read(3))

b'\xe9\xb8\xa3'

# 总结: 在py3中,如果你想要字符数据,即用于观看的,则用r模式,这样我f.read到的数据是一个经过decode的

# unicode数据; 但是如果这个数据我并不需要看,而只是用于传输,比如文件上传,那么我并不需要decode

# 直接传送bytes就好了,所以这个时候用rb模式.

# 在py3中,有一条严格的线区分着bytes和unicode,比如seek的用法,在py2和py3里都是一个个字节的seek,

# 但在py3里你就必须声明好了f的类型是rb,不允许再模糊.

# 建议: 以后再读写文件的时候直接用rb模式,需要decode的时候仔显示地去解码.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值