用Python操纵文件(自动化脚本的第一步)

用Python操纵文件(自动化脚本的第一步)

@(Python相关)

os模块相关

路径的跨平台(解决windows系统和Unix系统正反斜杠的问题)

import os
spam_path = os.path.join('usr','bin','spam')

控制工作目录

获取当前工作目录
cwd_path = os.getcwd()
更换当前工作目录
os.chdir(new_cwd_path)

创建新文件夹

os.makedirs(os.path.join(os.getcwd(),newdir,subdir))

此函数会沿着指定的路径连续创建不存在的文件夹,以确保路径的完整性

绝对路径与相对路径

检查给定路径是否是绝对路径
os.path.isabs(path)
将相对路径转化为绝对路径
abs_path = os.path.abspath(relative_path)

提取两个路径之间的相对路径(从start到end)

rel_path = os.path.relpath(end,start)

分离提取文件的绝对路径里的文件夹路径与文件名

dir_path = os.path.dirname(path)
file_name = os.path.basename(path)
dir_path, file_name = os.path.split(path)
若要逐级分离(当作字符串处理)
path_string.split(os.path.sep)
"""
此种用法在windows上第一个是磁盘的名称
而在Mac和Linux上第一个是空字符串,因为字符串的第一个字符就是分隔符~
"""
os.getcwd() -> '/mnt/lvm/dingning/datasets/coco'
os.getcwd().split(os.path.sep) -> ['', 'mnt', 'lvm', 'dingning', 'datasets', 'coco']

查看文件大小和文件夹内容

查看指定路径下的文件的大小(返回对应文件的字节数)
os.path.getsize(file_path)
查看指定文件夹路径对应的文件夹中的文件名称(返回文件名列表)
os.listdir(dir_path)

检查文件有效性

检查path对应的文件或文件夹是否存在(返回布尔变量)
os.path.exists(path)
检查file_path对应的文件路径是否存在,并且是否是一个文件(返回布尔变量)
os.path.isfile(file_path)
检查dir_path对应的文件夹路径是否存在,并且是一个文件夹(返回布尔变量)
os.path.isdir(dir_path)

遍历目录树 os.walk()

传入一个文件夹路径,在每次迭代时返回三个值:
  • 当前文件夹名称的字符串
  • 当前文件夹中子文件夹的字符串列表
  • 当前文件夹中问价的字符串列表
import os
for folderName, subfolders, filenames in os.walk(fold_path):
	print 'the current folder is ' + folderName
	
	for subfolder in subfolders:
		print 'something'
	for filename in filenames:
		print 'something'

File对象相关

文件读写

三个步骤:
  • 针对指定文件路径字符串调用open()返回一个File对象
  • 调用File对象的read() write()方法
  • 调用File对象的close()方法,关闭文件
  • 一般使用with ... as ... :方式使用文件
读取文件内容:
  • read() 将整个文件读取为一个字符串
  • readlines() 将文本的每一行读取为一个字符串,返回整个文件所有行字符串对应的列表
写入文件(只有一个write()方法):
  • 'w'方式打开文件,若该文件不存在,则创建,若存在,则覆盖
  • 'a'方式打开文件,若该文件不存在,则创建,若存在,则在文件内容的最后开始追加写入
  • write()不会自动加入\n,所以写入文件的时候如果需要换行,则需要自己添加换行分隔符

shelve模块保存Python变量(将Python变量保存到二进制shelf文件中)

import shelve
shelfFile = shelve.open('mydata')
cats = ['a','b','c']
shelfFile['cats'] = cats
shelfFile.close()
shelve文件就像一个列表,对每一个变量都可以取一个名字作为key,然后其内容则为value
list(shelfFile.keys()) -> ['cats']
list(shelfFile.values()) -> [['a','b','c']] """注意此处是一个列表,里面第一个元素正好是一个列表对象"""

pprint 模块--漂亮打印

  • pprint.pprint()将列表和字典漂亮打印到屏幕
  • pprint.pformat()将上述要打印到屏幕的文本以字符串的方式返回,利用此可以简单用程序编写python脚本
import pprint
cats = ['a','b','c']
fileObj = open('myCats.py','w')
fileObj.write('cats = ' + pprint.pformat(cats) + '\n')
fileObj.close()
在另一个python脚本中可以这样使用(用Python程序编写更加庞大的Python程序的基础)
from myCats import cats
print cats -> ['a','b','c']

shutil模块相关(shell utilize)(复制,移动,改名,删除)

复制文件和文件夹

shutil.copy(source, destination)source处文件复制到destination
  • destination如果是文件夹,则新文件名称与原始文件名称保持一致
  • destination如果是文件名,则以此文件名作为复制后的文件名复制
shutil.copytree(source, destination)source处文件夹复制到destination
  • 此时,sourcedestination都必须是文件夹的路径

文件夹的移动和改名 shutil.move(source, destination) 使用需谨慎~

  • destination指定的是文件夹,则必须判定该文件夹是否存在,否则会将路径当作是文件名重命名
  • 若其存在,则将文件移动到该文件夹下
  • destination指定的是文件名,若沿途的文件夹均存在,则移动到对应路径下,否则会抛出异常

删除文件 使用需谨慎

  • os.unlink(file_path) 必须存在且为文件路径,而不是文件夹路径
  • os.rmdir(dir_path) 必须存在且为文件夹路径,而且必须为空文件夹
  • shutil.rmtree(dir_path) 必须存在且为文件夹路径,不必为空文件夹
  • 使用时最好在此代码前面加入print将即将被删除的文件打印出来,提供给用户最终决定权

zipfile模块相关 处理zip压缩文件

基本框架

import os
import zipfile
zipObj = zipfile.ZipFile(file_path)   -> '生成一个ZipFile对象'
zipObj.namelist() -> '打印zip文件目录树,返回一个list'   -> '子方法,返回zip文件的目录list'
spamInfo = zipObj.getinfo('spam.txt') -> 将list中的一个文件名传入子方法getinfo中,可以返回一个ZipInfo对象

ZinInfo对象则保存zip文件每个子文件的有用的信息,如:

spamInfo.file_size
spamInfo.compress_size

解压缩 (ZipFile对象的子方法)

  • extract():第一个参数为zip文件中的子文件名,如namelist()中的一个文件名,第二个参数为目标文件夹路径
  • extractall():无参数则解压全部文件到本地,也可以传递一个文件夹路径,在指定文件夹下解压缩
如果指定文件夹不存在,则创建

创建和添加ZIP文件

import zipfile
newZip = zipfile.ZipFile('new.zip','w') '此处可以用追加方式,只需将w改为a'
newZip.write(file_path, compress_type=zipfile.ZIP_DEFLATED) '指定压缩算法'
newZip.close()
posted @ 2017-01-22 21:20  AI小虾米  阅读(582)  评论(0编辑  收藏  举报