您的位置:首页 > 编程语言 > Python开发

Python学习笔记 8--文件的管理、模块与包

2017-09-07 11:24 661 查看

一、文件管理

文件管理的三大步骤:

打开文件; f = open(“filename”)

处理文件;

f.read() # 可以读取文件内容

f.write(“hello”) # 不能往文件中写入,因为默认文件以r的模式打开;

关闭并保存文件;

f.close()

来看看具体如何操作的

fileHandle = open ( 'test.txt', 'w' )       ## 'w'是指文件将被写入数据
fileHandle.write ( 'This is a test.\nReally, it is.' )      ##这个语句将"This is a test."写入文件的第一行,"Really, it is."写入文件的第二行。
fileHandle.close()      ##最后,我们需要做清理工作,即关闭文件:


f.seek(偏移量,[起始位置])

用来移动文件指针

偏移量:单位:比特,可正可负

起始位置:默认为0

0-文件头,默认值;

1-当前位置;

2-文件尾

文件的几种模式总结:

r模式:

若文件不存在,直接报错;

文件只能读取,不能写入;

w模式:

若文件不存在,直接创建文件;

文件只能写入,不能读取;

打开文件时会清空原有文件内容;(如果想保留原来的内容,可以使用”a”方式在文件中结尾附加数据)

r+模式:

若文件不存在,直接报错;

文件可以读也可以写;

具体写入的内容在哪里,由文件指针(句柄)决定;

w+模式:

若文件不存在,直接创建文件;

文件既能写入也能读取;

打开文件时会清空原有文件内容;

a

若文件不存在,直接创建文件;

文件只能写入,不能读取;

写入的内容直接追加到文件最后;

a+

若文件不存在,直接创建文件;

文件既能写入也能读取;

写入的内容直接追加到文件最后;

b

以二进制的方式打开文件,可以跟r,w,+等组合使用;

文件的读取

read()          # 直接读取文件所有内容;
readline()      # 每次读取文件一行内容,返回类型为字符串;
readlines()     # 读取文件所有内容,以列表形式返回;
xreadlines()    # 类似生成器,文件内容不直接以列表方式返回;


文件的写入

write("str")                # 将字符串写入文件
writelines("["hello\n","world\n"]")     # 将序列的每个元素写入文件;


文件的其它操作

f.seek(偏移量,选项)
# 偏移量
如果为正数,代表向右偏移;如果为负数,代表向左偏移;
# 选项
如果为0,指针指向文件开始;
如果为1,指针指向当前位置;
如果为2,指针指向文件末尾;
f.flush()   # 提交对文件的修改,不用关闭并重新打开即可使对文件的操作生效;


文件的几个注意点:

文件对象是可迭代数据类型,可以通过for遍历文件的内容;

with open(“filename”) as f:通过这种方法来避免用户忘记关闭文件的问题;

程序示例:

1.

#!user/bin/env python
# coding:utf-8
"""
file:       file_ctrl
date:       2017 - 09 - 07  17:25
author:     fang
version:    1.0
desc:
"""
print "Test-1".center(40, "-")
f = open('test.txt', 'w')
f.write('line1 : This is a test.\nline2 : Really, it is.\nline3:\nline4:')  ##在test.txt中写入两行内容
f.close()
f = open('test.txt')  ##读取test.txt,并将内容显示出来
print f.read()
f.close()

print "Test-2".center(40, "-")
f = open('test.txt', 'a')
f.write('Bottom line.')  ##在test.txt末尾追加一行“Bottom line.”
f.close()
f = open('test.txt')
print f.read()
f.close()

print "Test-3".center(40, "-")
f = open('test.txt')
print f.readline(),  ##读取文件中的一行
# print f.readline(),     ##读取文件中的一行
4000

f.close()

# f = open ( 'test.txt' )
# fileList = f.readlines()<DIV></DIV>
# for fileLine in fileList:
#   print '>>', fileLine
# f.close()
print "Test-4".center(40, "-")
f = open('test.txt')
print "num1:", f.readline(),  ##读取文件中的一行(默认为第一行)
print "num2:", f.readline(),  ##指针在上一行的行末,读取的就是第二行的内容
f.close()

print "Test-5".center(40, "-")
f = open('test.txt')
print "num1:", f.readline(),  ##读取文件中的一行(默认为第一行)
f.seek(0)  ##指针回到文件首
print "num2:", f.readline(),  ##读取文件中的一行(指针在文件首,即第一个字节处,所以输出为第一行)
f.close()

print "Test-6".center(40, "-")
f = open('test.txt')
print f.readline(),
print f.tell()  ##获取Python在文件中的位置
print f.readline(),

print "Test-7".center(40, "-")
f = open('test.txt')
print f.read(4)  ##在文件中一次读取3个字节的内容
f.seek(1,0)     ##从文件开头向后偏移1个字节,也可以写成f.seek(1)
print f.tell()
print f.read(3)
f.seek(-12,2)     ##从文件结尾向前偏移12个字节
print f.tell()
print f.read(5)
f.close()

print "Test-8".center(40, "-")
f = open('testBinary.txt', 'wb')        ##在Windows和Macintosh环境下,有时可能需要以二进制方式读写文件,比如图片和可执行文件。此时,只要在打开文件的方式参数中增加一个"b"即可
f.write('There is no spoon.')
f.close()
f = open('testBinary.txt', 'rb')
print f.read()
f.close()

##运行结果
-----------------Test-1-----------------
line1 : This is a test.
line2 : Really, it is.
line3:
line4:
-----------------Test-2-----------------
line1 : This is a test.
line2 : Really, it is.
line3:
line4:Bottom line.
-----------------Test-3-----------------
line1 : This is a test.
-----------------Test-4-----------------
num1: line1 : This is a test.
num2: line2 : Really, it is.
-----------------Test-5-----------------
num1: line1 : This is a test.
num2: line1 : This is a test.
-----------------Test-6-----------------
line1 : This is a test.
25
line2 : Really, it is.
-----------------Test-7-----------------
line
1
ine
63
Botto
-----------------Test-8-----------------
There is no spoon.


显示文件的所有行,但忽略以#开头的行;

#!user/bin/env python
#coding:utf-8
"""
file:       file_read
date:       2017 - 09 - 07  18:28
author:     fang
version:    1.0
desc:
"""
import time
import sys

f=open("testfile","w+")
f.write('line1 : This is a test.\nline2 : Really, it is.\n#line3:\nline4:\nline5:bottom line')
f.flush()
f.seek(0)
for line in f:
print line,
print "\n"
print "去掉#开头的行".center(40,"=")
f.close()
f = open("testfile",'r')
for line in f.xreadlines():
if line.strip()[0] != "#":
print  line,
f.close()

##运行结果
line1 : This is a test.
line2 : Really, it is.
#line3:
line4:
line5:bottom line

==========去掉#开头的行===========
line1 : This is a test.
line2 : Really, it is.
line4:
line5:bottom line


逐页显示文本文件的程序,用户输入一个文件名,每次默认显示行数为10行,给用户一个选项,”是否继续?(Y|N)”

file = raw_input("FileName:").strip()
f = open(file,'r')
while True:
lines = 0       # 显示文件已经显示行数
for line in range(10):      # 每次读取的文件行数
cline = f.readline()
if cline:
lines += 1
print cline,
if lines < 10:
print "\n file over!"
break
choice = raw_input("Continue(Y|N)").upper()
if choice == "N":
break
f.close()


二、模块

1.简介

模块在 Python 中,一个.py文件就称之为一个模块(Module)。逻辑上组织python代码(函数,变量,类)•大大提高了代码的可维护性;


编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用;

导入模块的几种方式;

import MySQLdb as mysql :直接导入MySQLdb模块

from A import B:导入A模块里面的B方法:A(arges)只把A解释执行放入当前py文件中

from Aimport add as myaddmyadd = add

调用方式:如果当前py代码包含add方法,但仍然想要使用cacl模块中的add函数,可以对该函数进行重命名

2.模块的分类

内置模块(os,sys,dnspython,socket,time,excel)

开源模块(BeautifulSoup,flask,django , css,html,bootstrap,node.js)

自定义模块

3.常用内置模块使用介绍

3.1 os模块

python编程时,经常和文件、目录打交道,这是就离不了os模块。os模块包含普遍的操作系统功能,与具体的平台无关。以下列举常用的命令

1. os.name——判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix'




2. os.getcwd()——得到当前工作的目录。(get current work dir)




3. os.listdir()——显示指定所有目录下所有的文件和目录名。(以列表的形式全部列举出来,其中没有区分目录和文件。)
4. os.remove()——删除指定文件
5. os.rmdir()——删除指定目录
6. os.mkdir()——创建目录(这样只能建立一层,要想递归建立可用:os.makedirs())




7. os.path.isfile()——判断指定对象是否为文件。是返回True,否则False
8. os.path.isdir()——判断指定对象是否为目录。是True,否则False。
9.  os.path.exists()——检验指定的对象是否存在。是True,否则False.例:




10. os.path.split()——返回路径的目录和文件名。(注意把目录和文件区分开)








注意/test/文件夹下并没有test1这个文件,只有test1/文件夹,但是如果写成”os.path.split(“/test/test1”)”,则os.path.split这个命令认为test1是个文件,返回文件名。亦即os.path.split不会判断你输入的目录或者文件是否真实存在,相当于只是对你输入的字符串进行操作

11. os.system()——执行shell命令。##此处运行shell命令时,如果要调用python之前的变量,可以用如下方式


var=123
os.environ['var']=str(var) //注意此处[]内是 “字符串”
os.system('echo $var')


13. os.chdir()——改变目录到指定目录

14. os.path.getsize()——获得文件的大小,如果为目录,返回0

15. os.path.abspath()——获得绝对路径。










16. os.path.join(path, name)——连接目录和文件名。例:
17.os.path.basename(path)——返回文件名
18. os.path.dirname(path)——返回文件路径
19.




19. 获得程序所在的实际目录


import os
import sys

if __name__ == "__main__":
print os.path.realpath(sys
e011
.argv[0])
print os.path.split(os.path.realpath(sys.argv[0]))
print os.path.split(os.path.realpath(sys.argv[0]))[0]

执行结果

/root/PycharmProjects/0907/dir.py
('/root/PycharmProjects/0907', 'dir.py')
/root/PycharmProjects/0907




3.2 sys

sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分


sys.argv() : 在外部向程序内部传递参数



sys.exit(n) :执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常)



sys.path :环境变量,即获取指定模块搜索路径的字符串集合(显示的信息实际为一个列表,可以通过append()命令增加搜索目录)



sys.modules : sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。它拥有字典所拥有的一切方法。

sys.getdefaultencoding() : 获取系统当前编码,一般默认为ascii。

sys.setdefaultencoding() : 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行setdefaultencoding(‘utf8’),此时将系统默认编码设置为utf8。(见设置系统默认编码 )

sys.getfilesystemencoding() : 获取文件系统使用编码方式,Windows下返回’mbcs’,mac下返回’utf-8’.

sys.platform: 获取当前系统平台。

sys.stdin,sys.stdout,sys.stderr: stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

3.3 time

在实际的编程中我们要经常与时间打交道,所以time模块是非常有用的,在python中,对时间的处理并不只有time,还有datetime和calendar,locale。


time.localtime([secs]) :将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。

time.time():返回当前时间的时间戳。





time.gmtime([secs]):和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。

time.mktime(t):将一个struct_time转化为时间戳。

time.mktime(time.localtime())
1304576839.0


time.sleep(secs):线程推迟指定的时间运行。单位为秒。

time.clock():这个需要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间

import time
if __name__ == '__main__':
time.sleep(1)
print "clock1:%s" % time.clock()
time.sleep(1)
print "clock2:%s" % time.clock()
time.sleep(1)
print "clock3:%s" % time.clock()


运行结果:


clock1:3.35238137808e-006
clock2:1.00005142763
clock3:2.00011843636


其中第一个clock()输出的是程序运行时间
第二、三个clock()输出的都是与第一个clock的时间间隔


6. time.asctime([t]):把一个表示时间的元组或者struct_time表示为这种形式:’Sun Jun 20 23:21:05 1993’。如果没有参数,将会将time.localtime()作为参数传入。

time.asctime()
'Thu May 5 14:55:43 2011'


time.ctime([secs]):把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。

time.ctime()
'Thu May 5 14:58:09 2011'


time.ctime(time.time())
'Thu May 5 14:58:39 2011'


time.ctime(1304579615)
'Thu May 5 15:13:35 2011'


3.4 datetime

datetime模块提供对于日期和时间进行简单或复杂的操作. datetime 模块提供了以下的可用类型

datetime模块定义了两个常量:datetime.MINYEAR和datetime.MAXYEAR,分别表示datetime所能表示的最小、最大年份。其中,MINYEAR = 1,MAXYEAR = 9999。


datetime.date: 一个理想化的日期, 提供year, month, day属性

datetime.time: 一个理想化的时间, 提供hour, minute, second, microsecond, tzinfo.

datetime.datetime: 日期和时间的组合.提供year, month, day, hour, minute, second, microsecond, tzinfo.

datetime.timedelta: 表达两个date,time和datetime持续时间内的微妙差异.

datetime.tzinfo: 时间对象的抽象基类.

3.5 json/pickle

json和pickle模块,两个都是用于序列化的模块


json模块,用于字符串与python数据类型之间的转换

pickle模块,用于python特有类型与python数据类型之间的转换

两个模块,都提供了dumps,dump,loads,load 4个功能

json.loads()        ##loads 由字符串转其他数据类型
json.load()         ##将文档(内部是字符串格式)转换成python的其他数据类型
json.dumps()        ##将字典、列表、元组 转换成字符串格式
json.dump()         ##将字典、元组、列表转换成字符串格式并写入文档




注意 dump load 不要一起运行,会报错,一步一步来

3.6 shutil

在看django和scrapy源码的时候,可以看见他会有一个模式,即先有一些模块文件,在他的源码中,当你使用他规定的命令的时候,就会复制这些文件,来生成你要的模板文件。这里就是用了python自带的shutil模块。


shutil.copyfile( src, dst) : 从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉

shutil.move( src, dst) : 移动文件或重命名

shutil.copymode( src, dst) : 只是会复制其权限其他的东西是不会被复制的

shutil.copystat( src, dst) : 复制权限、最后访问时间、最后修改时间

shutil.copy( src, dst) : 复制一个文件到一个文件或一个目录

shutil.copy2( src, dst) : 在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西

shutil.copy2( src, dst) : 如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作

shutil.copytree( olddir, newdir, True/Flase) :

把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接

shutil.rmtree( src ) : 递归删除一个目录以及目录内的所有内容

3.7 random

random模块用于生成随机数


random.random() : 用于生成一个0到1的随机符点数: 0 <= n < 1.0

random.uniform(a, b) : 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a < b, 则 b <= n <= a。

random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b

random.randrange([start], stop[, step]) : 从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, … 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。

random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。

random.shuffle(x[, random]) : 用于将一个列表中的元素打乱

random.sample(sequence, k) : 从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。

三、包

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python 又引入了按目录来组织模块的方法,称为包(Package)


创建包的步骤:

创建一目录为包名;

在该文件夹下创建init.py文件存放包的信息,该文件可以为空;

根据需要存放脚本文件,已编译的扩展及子包;

用import,import as,from import等语句导入模块和包;

四、作用域

在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在 Python 中,是通过 _ 前缀来实现。比如__author__ , __name__就是特殊变量的,__func__,__fun为私有函数,不能直接引用。


五、第三方模块的安装(需要联接互联网 )

通过软件管理工具pip3安装(python3)

安装软件管理工具pip3 (python3中自带了pip3)

将pip3添加到环境变量

pip3 install 模块名

通过 setuptools 工具安装;

pip install 包名 ;

pycharm中安装;

六、模块搜索路径

当我们试图加载一个模块时,Python 会在指定的路径下搜索对应的.py 文件;

默认情况下,Python 解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在 sys 模块的 path 变量中;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息