每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。前面说过,当一个模块被第一次导 入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的 模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的name属性完成。测试如下代码:
if __name__ == '__main__':
print('当前代码被单独运行')
else:
print('当前代码被导入运行')
每个Python模块都有它的name,如果它是'main',这说明这个模块被用户单独运行,我们可以进行相应 的恰当操作。运行结果如下:
当前代码被单独运行
创建你自己的模块是十分简单的,你一直在这样做!每个以.py结尾的文件都是一个模块。下面我们先创 建一个myModule.py的文件,内容如下:
def sayhi():
print('Hi, this is mymodule speaking.')
version = '0.1'
从上面的代码可以看到,它与我们普通的Python程序相比并没有什么特别之处。我们接下来将看看如何 在我们别的Python程序中使用这个模块。这个模块应该被放置在我们导入它的程序的同一个目录中,或 者在sys.path所列目录之一。测试代码如下:
import myModule
myModule.sayhi()
print('Version', myModule.version)
运行结果如下:
Hi, this is newmodule speaking.
Version 0.1
文件目录操作
文件操作包含文件打开和关闭、读、写、重命名和删除,分别对应open、close、read、write几个方 法。新建fileHandler.py,用于测试和练习。
想要对一个文件进行操作,要先使用open方法获取文件的访问权限,该方法的完整定义如下:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None,
closefd=True, opener=None)
mode 参数可选值如下:
1、文件读取:
新建一个test.txt文件,文件内添加三行内容:
a
b
c
下面我们编写代码打开test.txt文件并读出其内容:
file = open('./test.txt','r')
print(file.read())file.close()
2、文件写入
添加如下测试代码:
filePath = './test.txt'
print('a模式写入.....')
def printContent(path):
with open(path,'r') as f:
print(f.read())
with open(filePath,'a') as f:
f.write("追加内容\r\n")
printContent(filePath)
上面的代码定义了一个printContent方法,接收一个传入的路径,然后打印文件的字符串内容。
1. 创建删除重命名
删除和重命名文件,使用os.remove和 os.rename方法。
os.remove() 方法用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError。
remove()方法语法格式如下:
os.remove(path)#path:要删除的文件路径
os.rename() 方法用于命名文件或目录,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError。 rename()方法语法格式如下:
os.rename(src, dst)
src表示要修改的目录名,dst表示修改后的目录名。 上面两个方法示例如下:
import os
def removeTest():
os.remove('./test.txt')
def renameTxt():
os.rename('./test.txt','./abc.txt')
目录枚举
# -*- coding: UTF-8 -*-
import sys
import os
os.chdir('c://')
def listCurrentDirectory(path):
files = os.listdir(path)
for name in files:
print(name)
listCurrentDirectory('.')
上面的代码中,首先我们使用os.chdir方法,将程序上下文的当前路径指定到我们的测试目录上来。接着 定义了一个listCurrentDirectory方法,该方法接收一个指定的路径,循环打印出该路径下的子目录和文 件的名称。获取子目录和文件信息使用的是os.listdir方法。
def listDirectoryDetail(path):
files = os.listdir(path)
for name in files:
pathName = os.path.join(path,name)
print(os.stat(pathName).st_mode) #inode 保护模式
print(os.stat(pathName).st_ino) #inode 节点号
print(os.stat(pathName).st_dev ) # inode 驻留的设备
print(os.stat(pathName).st_nlink) #inode 的链接数
print(os.stat(pathName).st_uid ) #所有者的用户ID
print(os.stat(pathName).st_gid )#所有者的组ID
print(os.stat(pathName).st_size )#文件的大小,普通文件以字节为单位的大小;
包含等待某些特殊文件的数据
print(os.stat(pathName).st_atime )#文件最后访问时间
print(os.stat(pathName).st_mtime )#文件最后修改时间
print(os.stat(pathName).st_ctime )#由操作系统报告的"ctime"。在某些系统上
(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间
listDirectoryDetail('.')
上面的代码中列举了os.stat方法可以枚举的信息
import stat
def listCurrentDirectoryMode(path):
files = os.listdir(path)
for name in files:
pathName = os.path.join(path, name)
mode = os.stat(pathName).st_mode
if stat.S_ISDIR(mode):
# 如果是目录
print('%s是文件夹' % pathName)
elif stat.S_ISREG(mode):
# 如果是文件
print('%s是文件'%pathName)
else:
# 未知类型
print('•未知目录类型 %s' % pathName)
listCurrentDirectoryMode('.')
上面代码中我们使用了S_ISDIR来判断是否是文件夹,使用S_ISREG来判断是否是文件,
其他类型的判断如下:
if stat.S_ISREG(mode): #判断是否一般文件
print 'Regular file.'
elif stat.S_ISLNK (mode): #判断是否链接文件
print 'Shortcut.'
elif stat.S_ISSOCK (mode): #判断是否套接字文件
print 'Socket.'
elif stat.S_ISFIFO (mode): #判断是否命名管道
print 'Named pipe.'
elif stat.S_ISBLK (mode): #判断是否块设备
print 'Block special device.'
elif stat.S_ISCHR (mode): #判断是否字符设置
print 'Character special device.'
elif stat.S_ISDIR (mode): #判断是否目录
print 'directory.'
通过函数filemode可以很方便的打印文件的mode信息:
def printChmode(path):
files = os.listdir(path)
for name in files:
pathName = os.path.join(path, name)
mode = os.stat(pathName).st_mode
print(filemode(mode))
printChmode('.')
Thread类init方法定义如下:
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, *, daemon=None):