一. Python 读写 创建文件
Python中对文件,文件夹(文件操作函数)的操作需要涉及到OS 模块和 shutil 模块 .
一) . OS模块 的基本操作
方法 | 功能 |
---|---|
os.getcwd() | 得到当前工作目录,及当前Python脚本工作的目录路径 |
os.listdir() | 返回指定目录下的所有文件和目录名: |
os.remoce() | 函数用来删除一个文件 |
os.removedirs(r"C:\python") | 删除多个目录 |
os.path.isfile() | 验证给出的路径是否是一个文件 |
os.patn.isdir() | 验证给出的路径是否是一个目录 |
os,path.isabs() | 判断是否是绝对路径 |
os.path.exists() | 检验给出的路径是否真的存在 |
os.path.split() | 返回一个路径的目录名和文件名 |
os.path.splitext() | 分离扩展名 |
os.path.dirname() | 获取路径名 |
os.path.basename() | 获取文件名 |
os.system() | 运行shell命令 |
os.getenv()与os.putenv() | 读取和设置环境变量 |
os.linesep | 给出当前平台使用的行终止符 Windows使用’\r\n’,Linux使用’\n’而Mac使用’\r’ |
os.name | 指示你正在使用的平台 对于Windows,它是’nt’,而对于Linux/Unix用户,它是’posix’ |
os,rename(old,new) | 重命名 |
os.mekedirs(r“c:\python\test”) | 创建多级目录 |
os.makedir() | 创建单个目录 |
os.stat(file) | 获取文件属性 |
os.chmod(file) | 修改文件权限与时间戳 |
os.exit() | 终止当前进程 |
os.path.getsize(filename) | 获取文件大小 |
os.mknod("test.txt") | 创建空文件 |
fp=open("test.txt,w") | 直接打开一个文件,如果不存在则创建文件 |
二) shutil模块的基本操作
1 .简介:
shutil : 高级的 文件、文件夹、压缩包处理模块
2 . 使用
1) shutil.copyfileobj(文件1,文件2) :将文件1的数据复制copy给文件2.
import shutil
f1 = open("1.txt",encoding="utf-8")
f2 = open("2.txt",encoding="utf-8")
shutil.copyfileobj(f1,f2)
2) shutil.copyfile(文件1,文件2) : 不用打开文件名进行覆盖copy.
import shutil
shutil.copyfile("1.txt","3.txt")
2) shutil.copymode(src,dst) (前提是dst文件存在,不然报错)仅拷贝权限.内容,组,用户均不变
import os
import shutil
stat1 = os.stat('2.txt')
print('2.txt的属性:',stat1)
print('2.txt的mode属性:',stat1.st_mode)
stat2 = os.stat('520.py')
print('520.py的属性:',stat2)
print('520.py的mode属性:',stat2.st_mode)
shutil.copymode('2.txt','520.py')
stat3 = os.stat('520.py')
print('shutil.copymode("2.txt","520.py")后520.py的属性:',stat3)
print('shutil.copymode("2.txt","520.py")后520.py的mode属性:',stat3.st_mode)
======================
2.txt的属性: os.stat_result(st_mode=33323, st_ino=949061, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=91, st_atime=1534563978, st_mtime=1534563620, st_ctime=1534568796)
2.txt的mode属性: 33323
520.py的属性: os.stat_result(st_mode=33204, st_ino=948799, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=46, st_atime=1534569597, st_mtime=1534569597, st_ctime=1534569597)
520.py的mode属性: 33204
shutil.copymode("2.txt","520.py")后520.py的属性: os.stat_result(st_mode=33323, st_ino=948799, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=46, st_atime=1534569597, st_mtime=1534569597, st_ctime=1534569647)
shutil.copymode("2.txt","520.py")后520.py的mode属性: 33323
3) . shutil.copystat(src, dst) 仅拷贝状态信息,即文件属性,包括:mode bits, atime, mtime, flags
import os
import shutil
stat1 = os.stat('2.txt')
print('2.txt的属性:',stat1)
print('2.txt的stat属性:',stat1.st_mode,stat1.st_atime,stat1.st_mtime,stat1.n_fields)
stat2 = os.stat('521.py')
print('521.py.py的属性:',stat2)
print('521.py.py的stat属性:',stat2.st_mode,stat2.st_atime,stat2.st_mtime,stat2.n_fields)
shutil.copystat('2.txt','521.py')
stat3 = os.stat('521.py')
print('shutil.copystat("2.txt","521.py")后521.py的属性:',stat3)
print('shutil.copystat("2.txt","521.py")后521.py的stat属性:',stat3.st_mode,stat3.st_atime,stat3.st_mtime,stat3.n_fields)
================================
2.txt的属性: os.stat_result(st_mode=33323, st_ino=949061, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=91, st_atime=1534563978, st_mtime=1534563620, st_ctime=1534568796)
2.txt的stat属性: 33323 1534563978.802531 1534563620.6685243 19
521.py.py的属性: os.stat_result(st_mode=33204, st_ino=949087, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=31, st_atime=1534572967, st_mtime=1534572967, st_ctime=1534572967)
521.py.py的stat属性: 33204 1534572967.3448722 1534572967.3448722 19
shutil.copystat("2.txt","521.py")后521.py的属性: os.stat_result(st_mode=33323, st_ino=949087, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=31, st_atime=1534563978, st_mtime=1534563620, st_ctime=1534572967)
shutil.copystat("2.txt","521.py")后521.py的stat属性: 33323 1534563978.802531 1534563620.6685243 19
4) . shutil.copytree(src, dst, symlinks=False, ignore=None) 递归的去拷贝文件夹
shutil.ignore_patterns(patterns)(忽略哪个文件,有选择性的拷贝)
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
5). shutil.rmtree(path[, ignore_errors[, onerror]]) 递归的去删除文件
shutil.rmtree('folder1')
6). shutil.move(src, dst) 递归的去移动文件,它类似mv命令,其实就是重命名。
shutil.move('folder1', 'folder3')
7). shutil.make_archive(base_name, format,...)
创建压缩包并返回文件路径,例如:zip、tar
创建压缩包并返回文件路径,例如:zip、tar
- base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径, 如:www =>保存至当前路径 如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
- format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”
- root_dir: 要压缩的文件夹路径(默认当前目录)
- owner: 用户,默认当前用户
- group: 组,默认当前组
- logger: 用于记录日志,通常是logging.Logger对象
#将 /Users/wupeiqi/Downloads/test 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
#将 /Users/wupeiqi/Downloads/test 下的文件打包放置 /Users/wupeiqi/目录
import shutil
ret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')
shutil 对压缩包的处理是调用 ZipFile 和 TarFile 两个模块来进行的,详细:
import zipfile
# 压缩
z = zipfile.ZipFile('laxi.zip', 'w')
z.write('a.log')
z.write('data.data')
z.close()
# 解压
z = zipfile.ZipFile('laxi.zip', 'r')
z.extractall()
z.close()
import tarfile
# 压缩
tar = tarfile.open('your.tar','w')
tar.add('/Users/wupeiqi/PycharmProjects/bbs2.log', arcname='bbs2.log')
tar.add('/Users/wupeiqi/PycharmProjects/cmdb.log', arcname='cmdb.log')
tar.close()
# 解压
tar = tarfile.open('your.tar','r')
tar.extractall() # 可设置解压地址
tar.close()
OS模块 shutil模块 SyS模块的区别
模块 | 功能 |
---|---|
OS模块 | 主要是与操作系统的交互 |
shutil模块 | 高级的文件,文件夹,压缩包处理模块,也是与系统的交互 |
SyS模块 | 主要是与Python解释器的交互 |
二. 文件的读写操作
一) 基本知识
打开文件的模式 | 打开文件的方式 |
---|---|
r | 以只读的方式打开文件 |
r+ | 可读写,文件不存在时会报错 |
rb | 只读二进制 |
r+b | 可读写二进制,文件不存在,回报io错误 |
w | 以只写的方式打开 |
w+ | 读写的形式打开,将原有的内容擦处 |
wb | 只读写二进制 |
w+b | 只写二进制 |
a | 写在末端 |
a+ | 以附加的形式打开可读写的文件 |
ab | 以只写二进制形式打开 |
a+b | 以二进制方式追加 |
二). 打开文件的方法
- 方法一
f = open(file,modle,encoding="utf-8")
content = f.read()
lines = file.readlines()
for line in lines:
print(line)
f.close()
- 精简方式
with open("test.txt","a",encoding="utf-8",error="ignore") as file:
file.read() # 可以添加每次读取的字节数
file.weite()
# 不需要close,也不需要异常处理异常,自动关闭
- 文件的其他操作
F.flush()
#把缓冲区的内容写入硬盘
F.fileno()
#返回一个长整型的”文件标签“
F.isatty()
#文件是否是一个终端设备文件(unix系统中的)
F.tell()
#返回文件操作标记的当前位置,以文件的开头为原点
F.next()
#返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。
F.seek(offset[,whence])
#将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
F.truncate([size])
#把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
三). 读写 csv文件的操作
1. 读操作
import csv
with open("test.csv","r",encoding="utf-8") as f:
reader =csv.reader(f,"excel",delimiter=";",quoting=csv.QUOTE_MINIMAL)
for row in reader:
print(row)
2. 写操作
import csv
with open ("xxx.csv","a",newline=" ") as f:
writer = csv.write(f,delimiter=";",quotechar="|",quoting=csv.QUOTE_MINIMAL)
writer.writerow(["Tome"]*5+["End Tom"])
四). 读写字典的操作
1. 读操作
import csv
with open("test.csv") as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
print(row["first_name"],row["last_name"])
2. 写操作
import csv
with open("test.csv","w") as csvfile:
fieldnames = ["first_name","last_name"] # 写入文件的列名
writer = csv.DictWriter(csvfile,fieldnames=fieldnames)
writer.writerheader()
writer.writerow({"first_name":"Backes","last_name":"Beans"})
demo
import csv
with open("test.csv","w") as csvfile:
writer = csv.writer(csvfile)
# 先写入columns_name
writer.writerow(["index","a_name","b_name"])
# 写入多行用writerows
# 可以加入一个for循环写入
writer.writerows([0,1,3],[1,2,3],[2,3,4])
test
# 功能: 讲一字典写入到csv文件中
# 输入: 文件名称,数据字典
import csv
def createDictCSV(filename="",dataDict={}):
with open(fileName,"wb") as csvFile:
csvWriter = csv.writer(csvFile)
for k,v in dataDict.iteritens():
csvWriter.writerow([k,v])
csvFile.close()
三. json 解析
一) . JSON 简介
1. JSON (JavaScript Object Notation),是一种数据交互格式.
Json之前,大家都用 XML 传递数据。XML 是一种纯文本格式,所以适合在网络上交换数据,但是 XML 格式比较复杂,终于道格拉斯·克罗克福特(Douglas Crockford)发明了JSON 这种超轻量级的数据交换格式。
2. JSON 如何使用
- 数据格式
JSON 实际上是 JavaScript的一个子集,所以JSON 的数据格式和JavaScript 是对应的:- number => JS number
- boolean => JS boolean
- string => JS string //
- null => JS null
- array => JS Array 的表达方式 []
- object => JS {} 表达式
3. 序列化与反序列化
1). JSON.stringify() # 将对象序列化为JSON字符串
- JSON.stringify({},[]," ")
- 参数一: 要序列化的数据(object)
- 参数二:控制对象的键值,只想输出制定的属性, 传入一个数组
- 参数三 : 序列化后,打印输出的格式(一个Tab,可跟直观的查看JSON)
2).JSON.parse() # 讲JSON数据解析为JavaScript对象
- JSON.parse(json.data) # 传入json字符串
把 JavaScript 变成 Json ,就是把这个对象序列化为Json字符串,然后才可以通过网络传递.
如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。
二). JSON数据格式的形式
1. 数组形式[ ]
[
{
"id" : 1 ,
"naem" : "xiaoming" ,
},
{
"id" : 2,
"naem" : "tom" ,
}]
2. 对象形式
// 前后端分离,推荐后端返回给前端数据格式
{
"status" : 200 ,
"msg" : "success" ,
"data" : [
{
"id" : 1 ,
"naem" : "xiaoming" ,
},
{
"id" : 2,
"naem" : "tom" ,
}]
}
3. 数组对象混合
三). 读写JSON常用的函数
1. json.dumps()和json.loads() 是json格式处理函数
1). json.dumps()函数是将一个python数据类型列表进行json格式的编码,json.dumps()函数是将字典转化为字符串
2). json.loads()函数是将json格式数据转换过为字典,可以这么理解,json.loads()函数是将字符串转化为字典,用字典的方法来取值.
2. 实例说明
1). json.dumps()
- json.dumps()用于将dict类型的数据转成str,因为如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数。
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444',}
jsObj = json.dumps(name_emb)
print(name_emb)
print(jsObj)
print(type(name_emb))
print(type(jsObj))
======================
{'a': '1111', 'c': '3333', 'b': '2222', 'd': '4444'}
{"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
<type 'dict'>
<type 'str'>
- json.dump()用于将dict类型的数据转成str,并写入到json文件中。下面两种方法都可以将数据写入json文件
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
emb_filename = ("emb_json.json")
# 方法一
jsObj = json.dumps(name_emb)
with open(emb_filename,"w") as f:
f.write(jsObj)
f.close()
# 方法 二
json.dump(name_emb,open(emb_filename,"w"))
2). json.loads()
- json.loads()用于将str类型的数据转成dict。
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444',}
jsDumps = json.dumps(name_emb)
jsLoads = json.loads(jsDumps)
print(name_emb)
print(jsDumps)
print(jsLoads)
print(type(name_emb))
print(type(jsDumps))
print(type(jsLoads))
==========================
# 'a'变成了'a'是因为发生了类型转换,str会转换成unicode
{'a': '1111', 'b': '2222', 'c': '3333', 'd': '4444'}
{"a": "1111", "b": "2222", "c": "3333", "d": "4444"}
{'a': '1111', 'b': '2222', 'c': '3333', 'd': '4444'}
<class 'dict'>
<class 'str'>
<class 'dict'>
- json.load()用于从json文件中读取数据。
import json
emb_filename = ("./emb_json.json")
jsObj = json.load(open(emb_filename))
print(jsObj)
print(type(jsObj))
for key in jsObj.keys():
print("key:%s value: %s" %(key,jsObj.get(key)))
======================
{'a': '1111', 'b': '2222', 'c': '3333', 'd': '4444'}
<class 'dict'>
key:a value: 1111
key:b value: 2222
key:c value: 3333
key:d value: 4444