操作文件和目录
python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块
得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()
返回指定目录下的所有文件和目录名:os.listdir()
函数用来删除一个文件:os.remove()
删除多个目录:os.removedirs(r“c:\python”)
检验给出的路径是否是一个文件:os.path.isfile()
检验给出的路径是否是一个目录:os.path.isdir()
判断是否是绝对路径:os.path.isabs()
检验给出的路径是否真地存:os.path.exists()
返回一个路径的目录名和文件名:os.path.split() eg os.path.split('/home/swaroop/byte/code/poem.txt') 结果:('/home/swaroop/byte/code', 'poem.txt')
分离扩展名:os.path.splitext()
获取路径名:os.path.dirname()
获取文件名:os.path.basename()
运行shell命令: os.system()
读取和设置环境变量: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.makedirs(r“c:\python\test”)
创建单个目录:os.mkdir(“test”)
获取文件属性:os.stat(file)
修改文件权限与时间戳:os.chmod(file)
终止当前进程:os.exit()
获取文件大小:os.path.getsize(filename)
移动文件(目录)
shutil.move("oldpos","newpos")
复制文件:
shutil.copyfile("oldfile","newfile") oldfile和newfile都只能是文件
shutil.copy("oldfile","newfile") oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
复制文件夹:
shutil.copytree("olddir","newdir") olddir和newdir都只能是目录,且newdir必须不存在
重命名文件(目录)
os.rename("oldname","newname") 文件或目录都是使用这条命令
流的理解
IO 编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水
管,数据就是水管里的水,但是只能单向流动。
流的分类
按照流向
1 Input Stream 就是数据从外面(磁盘、网络)流进内存,
2 Output Stream 就是数据从内存流到外面去
文件操作:
os.mknod("test.txt") 创建空文件
fp = open("test.txt",w) 直接打开一个文件,如果文件不存在则创建文件
关于open 模式:
w 以写方式打开,
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+ 以读写模式打开
w+ 以读写模式打开 (参见 w )
a+ 以读写模式打开 (参见 a )
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
文件读取
1 读
使用 Python 内置的 open() 函数,传入文件名和标示符:
f = open('d:/a.txt', 'r')
注意:
1 标示符'r'表示读 文件不存在, open() 函数就会抛出一个 IOError 的错误
2 文件打开成功Python 把内容读到内存,用一个 str 对象表示
3 调用 close() 方法关闭文件 因为文件对象会占用操作系统的资源 f.close()
4 文件读写时都有可能产生 IOError ,一旦出错,后面的 f.close() 就不会调用,解决方案1 使用 try ... finally 来实现 2 引入了 with 语句来自动 帮我们调用 close()(建议)
如: with open('/path/to/file', 'r') as f:
print(f.read())
5 f.read()不适合大文件如果10g,加载到内存,内存就爆了 用read(size) 方法,每次最多读取size 个字节的内容。另外,调用 readline() 可以每次读取一行内容
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
6 要读取非UTF-8编码的文本文件,需要给 open() 函数传入 encoding 参数,
例如,读取 GBK 编码的文件:
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
2 写
写文件和读文件是一样的,唯一区别是调用 open() 函数时,传入标识符
'w' 或者 'wb' 表示写文本文件或写二进制文件:
注意:
1 务必要调用 f.close() 来关闭文件 ,只有调用 close() 方法时,操作系统才保证把没有写入的数据全部写入磁盘
StringIO 和 和 BytesIO
数据读写不一定是文件,也可以在内存中读写
1 StringIO 顾名思义就是在内存中读写 str。
from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
以用一个 str 初始化 StringIO,然后,像读文件一样
读取:
>>> from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
... s = f.readline()
... if s == '':
... break
... print(s.strip())
...
Hello!
Hi!
Goodbye!
2 StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO
from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
请注意,写入的不是 str,而是经过 UTF-8 编码的 bytes。
和 StringIO 类似,可以用一个 bytes 初始化 BytesIO,然后,像读文件一
样读取:
>>> from io import StringIO
>>> f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
>>> f.read()
b'\xe4\xb8\xad\xe6\x96\x87'
Xml 和json
XML 指可扩展标记语言(eXtensible Markup Language)。
XML 被设计用来传输和存储数据,和配置
XML 很重要,也很容易学习
Json
JSON(JavaScript Object Notation),类似于XML,是一种数据交换格式,比如JAVA产生了一个数据想要给JavaScript,则除了利用XML外,还可以利用JSON;
JSON相比XML的优势是表达起来很简单;
JSON是AJAX中的X(就是可以取代XML); ------出自JSON创始人;
JSON数据结构
JSON有两种数据结构:
(1)Map,也称为对象;{....}
(2)Array;[......]
也就是说所有的JSON对象都是要以这些形式表示;
Xml,json 作用: 不同的编程语言和不同平台之间传递对象
1.Map
简单的说就是Java中的Map,名称-值对的形式给出,名称和值之间用“:”隔开,两个Map之间用“,”隔开,一般表示形式如下:
{'key1':'value1','key2':'value2'}
以下为官网的图:
2.Array
就是普通意义上的数组,一般形式如下:
['arr1','arr2','arr3'];
以下为官网的图:
图中的value可以是:
总结:
(1)JSON的数据结构只有两种;
(2)可以嵌套表示,比如Array中可以嵌套Object等;
解析和生成
生成
Python 内置的 json 模块提供了非常完善的 Python 对象到 JSON 格式的
转换。我们先看看如何把 Python 对象变成一个 JSON:
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'
dumps() 方法返回一个 str ,内容就是标准的 JSON
解析
要把 JSON 反序列化为 Python 对象,用 loads() 或者对应的 load() 方法,
前者把 JSON 的字符串反序列化
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}
JSON 标准规定 JSON 编码是 UTF-8,所以我们总是能正确地在
Python 的 str 与 JSON 的字符串之间转换
对象序列化和反序列化
1 对象序列化:把对象转换成数据
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('Bob', 20, 88)
jsondate = json.dumps(s, default=lambda obj: obj.__dict__) (建议)
2 对象反序列化: 把数据转换成对象
如果我们要把 JSON 反序列化为一个 Student 对象实例,
loads() 方法首先转换出一个 dict 对象,然后,我们传入的 object_hook
函数负责把 dict 转换为 Student 实例:
student= json.loads(jsondata, object_hook=lambda d: Student(d['name'], d['age'], d['score']))