文件系统

使用文件系统方法

## 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 会报错。