Python 文件相关操作
文件内容操作
打开文件
file object = open(file_name [, access_mode][, buffering])
其中 file_name 标示了需要打开的文件,access_mode 标示了读写的方式,buffering 给出缓存机制(0 表示不寄存,1表示寄存行,大于 1 就是寄存区的缓冲大小,小于 0 则为系统默认值)
不同打开模式说明
打开的 file 对象有以下常用属性
写操作
打开文件之后,可以通过 write() 进行文件写操作,需要注意的是其只将用户给出的字符串写入文本并不会添加任何其他字符(换行等)。
读操作
文件读操作给出了一下函数:
read([count]):从文件中读取一个字符串,通过 count 指定读取的字节数。如果没有指定 count 那么将尽可能多的读取,很可能直到文件的末尾readline([size]):从文件中读取单独的一行,以 ‘\n’ 作为区分。如果返回一个空字符串(不包含任何字符,甚至 ‘\n’),表明已读取最后一行。 readlines([size]):以列表的形式返回文件中每一行的内容。如果指定 size,那么将读入的 size 长字符串按行分割存入列表。最后 file 对象可以通过 for line in file: 进行迭代从而获取文件的每一行
定位操作
同时 file 还提供了定义读写位置的函数,tell() 将返回下次读写相对于文件开头的字节数。seek(offset, [from]) 可以实现从指定位置偏移的字节数。from 为 0 表示以文件开头作为参考位置,为 1 表示以当前位置作为参考位置,为 2 表示以文件结尾作为参考位置。
关闭操作
打开的 file 对象,需要调用 close() 函数进行关闭。如果某个文件对象被重新指定给另一个文件时,Python 会自动关闭之前的文件,但不会写入仍在缓冲区的内容。
以下给出一个具体表格
文件操作——os 模块
os.sep:操作系统的路径分隔符os.getcwd():返回当前工作目录os.chdir(path):改变当前工作目录os.chroot(path):改变当前进程的根目录os.listdir(path):返回 path 指定文件夹包含的文件或文件夹的名字的列表(不进行递归)os.mkdir(path [, mode]):以数字 mode 的 mode 创建一个名为 path 的文件夹。默认的 mode 是 0777 (八进制)os.makedirs(path):递归创建文件夹os.remove(path):删除路径为path的文件。如果 path 是一个文件夹,将抛出OSError; 查看下面的 rmdir() 删除一个 directory。os.removedirs(path):递归删除目录。os.rename(src, dst):重命名文件或目录,从 src 到 dstos.renames(old, new):递归地对目录进行更名,也可以对文件进行更名。os.rmdir(path):删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))
"""
./.bash_logout
./amrood.tar.gz
./.emacs
./httpd.conf
./www.tar.gz
./mysql.tar.gz
./test.py
./.bashrc
./.bash_history
./.bash_profile
./tmp
./tmp/test.py
"""
路径操作——path 模块
os.path.abspath(path):返回绝对路径os.path.basename(path) :返回文件名os.path.commonprefix(list):返回list(多个路径)中,所有path共有的最长的路径os.path.dirname(path):返回文件路径os.path.exists(path) :如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。os.path.getsize(path):返回文件大小,如果文件不存在就返回错误os.path.isabs(path):判断是否为绝对路径os.path.isfile(path):判断路径是否为文件os.path.isdir(path):判断路径是否为目录os.path.join(path1[, path2[, ...]]):把目录和文件名合成一个路径os.path.split(path):把路径分割成 dirname 和 basename,返回一个元组os.path.splitext(path):分割路径,返回路径名和文件扩展名的元组
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
print( os.path.basename('/root/runoob.txt') ) # 返回文件名
print( os.path.dirname('/root/runoob.txt') ) # 返回目录路径
print( os.path.split('/root/runoob.txt') ) # 分割文件名与路径
print( os.path.join('root','test','runoob.txt') ) # 将目录和文件名合成一个路径
"""
runoob.txt
/root
('/root', 'runoob.txt')
root/test/runoob.txt
"""
高级 API——shutil
import shutil
# 将文件内容拷贝到另一个文件中
shutil.copyfileobj(open('old.txt', 'r'), open('new.txt', 'w'))
# 拷贝文件
shutil.copyfile('old.txt', 'old1.txt')
# 仅拷贝权限。内容、组、用户均不变
shutil.copymode('old.txt', 'old1.txt')
# 复制权限、最后访问时间、最后修改时间
shutil.copystat('old.txt', 'old1.txt')
# 复制一个文件到一个文件或一个目录
shutil.copy('old.txt', 'old2.txt')
# 在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了
shutil.copy2('old.txt', 'old2.txt')
# 把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接
shutil.copytree('C:/Users/xiaoxinsoso/Desktop/aaa', 'C:/Users/xiaoxinsoso/Desktop/bbb')
# 移动目录或文件
shutil.move('C:/Users/xiaoxinsoso/Desktop/aaa', 'C:/Users/xiaoxinsoso/Desktop/bbb') # 把aaa目录移动到bbb目录下
# 删除一个目录
shutil.rmtree('C:/Users/xiaoxinsoso/Desktop/bbb') # 删除bbb目录
文件操作——压缩文件实例
import zipfile
# 打包目录为zip文件(未压缩)
def make_zip(source_dir, output_filename):
zipf = zipfile.ZipFile(output_filename, 'w')
pre_len = len(os.path.dirname(source_dir))
for parent, dirnames, filenames in os.walk(source_dir):
for filename in filenames:
pathfile = os.path.join(parent, filename)
arcname = pathfile[pre_len:].strip(os.path.sep)
zipf.write(pathfile, arcname)
zipf.close()
make_zip("version_1.0", "version_1.0" + ".zip")