文件系统
使用文件系统方法
## Using File System Shell Mothod
from os import path
import shutil
def main():
# check file exist
if path.exists("file1.txt"):
src = path.realpath("file1.txt")
else:
src = "file not exist!"
# split
dir, filename = path.split(src)
print dir
print filename
print src
# copy file
print "copy this file:"
dst = src + ".bak"
shutil.copy(src, dst)
shutil.copystat(src, dst)
# archive
root_dir, tail = path.split(src)
shutil.make_archive("archive", "zip", root_dir)
if "__main__" == __name__:
main()
path.exists - 判断文件是否存在,经常用于对文件的操作之前,先检查文件是否存在,如果不在的话,需要提前创建或其他操作,否则会报错文件不存在
path.realpath - 返回的是文件的完成路径,参数传进去的是相对路径
path.split - 将文件名和路径分开
shutil.copy 拷贝文件到新的目的文件
shutil.copystat 有的时候不仅仅需要拷贝文件内容,还需要拷贝对应的权限等状态,就需要用到copystat函数
shutil.make_archive 将指定的文件夹目录打包成指定的格式
查看运行结果:
如果文件系统下面没有file1.txt文件,那么会打印"file not exist!",如果继续执行,在后面操作这个文件时会报错
IOError: [Errno 2] No such file or directory: 'file not exist!'
如果创建了文件file1.txt,那么运行完成上面命令之后可以看到四个文件
archive.zip
file1.txt
file1.txt.bak
python.py
如果查看文件权限,可以看到file1.txt和file1.txt.bat是完全一样的。
解析路径树
## Parsing Directory Trees
import os
import sys
path = sys.argv[1]
for path, dirs, files in os.walk(path):
print path
print ""
for file in files:
print file
print "walk completed!"
主要用到了os.walk函数,能够遍历目录,并且返回相应的路径,目录及文件名
查看运行结果:
python.py .
首先打印当前路径,然后遍历文件(包括文件夹),并打印名字
.
archive.zip
file1.txt
file1.txt.bak
python.py
.\test
walk completed!
Zip文件操作
# Process zip file
import zipfile
fh = zipfile.ZipFile('mydata.zip','a')
fh.write('file1.txt')
fh.write('newfile.txt')
fh.close()
zipfile.ZipFile 用来获取zip文件句柄,后面有两个参数,一个是文件名,一个是操作方式,可以是'w'或者'a','a'是追加,不影响之前内容,'w'是覆盖,用新写的内容替换之前的内容。
如果文件不存在,会自动创建。
查看运行结果: 执行上面语句后,mydata.zip文件里包含两个文件:file1.txt和newfile.txt
读zip文件
刚刚上面讲的是怎么去创建及操作一个zip文件,接下来讲怎么去读这个文件的内容:
# Reading Zip file
import zipfile
fh = zipfile.ZipFile('mydata.zip','r')
names = fh.namelist()
for name in names:
print name
fh2 = fh.open(name)
contents = fh2.read()
在创建句柄时,首先改变打开方式为"r",然然后可以用fh.namelist()获取所有的文件名。
Modules
系统标准库
## Using Standard Library Modules
import sys
import os
import datetime
def main():
print "version {}.{}.{}".format(*sys.version_info)
print sys.platform
print os.name
print os.getenv("path")
print os.getcwd()
now = datetime.datetime.now()
print now
print now.year, now.month, now.day, now.hour
上面例子中用到了三个系统库 sys os 和 datetime
sys.version_info 返回python版本信息
sys.platform 返回平台信息 (win32, win64, linux)
os.name 返回os名字
os.getenv 返回系统环境变量
os.getcwd 返回当前路径
datetime 是系统时间处理库
查看结果:
version 2.7.10 win32
nt
C:\Perl64\site\bin; ......
C:\Users\bhe001\python
2018-04-02 13:49:29.690000
2018 4 2 13
Packages 包
可以将一些通用功能写成packages供其他模块调用
比如,写一个简单的计算函数,并不需要在每个文件里都去定义,可以写成一个库文件 allmath.py
## Packages
allmath.py
def add(x,y):
return x+y
def minus(x,y):
return x-y
def mult(x,y):
return x*y
def div(x,y):
return x/y
在调用处先import这个库,然后执行相应的函数即可
import allmath
print allmath.add(3,4)
Modules Aliases 模块别名
对于import的模块,我们给他一个别名。
有的时候,引用的两个模块名字一样时,这个操作会增强便利性。
比如上面的例子,我们可以改为
import allmath as mymath
print mymath.add(3,4)
这个时候,如果再执行 allmath.add
会报错。