Python————文件

文章目录

    • 文件
        • 1. 文件操作介绍
            • 1)什么是文件
            • 2)文件的作用
            • 3)文件的打开与关闭
        • 2.文件的读写
            • 1)File对象的常用方法
            • 2)文件的打开
            • 3)文件的关闭
            • 4)文件的应用: 文件的备份
        • 3.os模块详解
            • 1)关于操作系统
            • 2)关于路径
            • 3)os模块
            • 4)小练习: 文件批量重命名练习:
        • 4.json模块详解
            • 1)什么是json
            • 2)python类型数据和JSON数据格式互相转换规则
            • 3)数据类型编解码
            • 4)序列化及反序列化常用参数
            • 5)自定义复杂数据类型编解码
            • 6)pickle模块详解
            • 7)JSON和pickle模块的区别

文件

1. 文件操作介绍

1)什么是文件

计算机文件是以计算机硬盘为载体存储在计算机上的信息集合。文件可以是文本文档、图片、程序等等。文件通常具有三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以 JPEG 格式保存并且文件扩展名为 .jpg)。

2)文件的作用

一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭都没地方哭了”。 默认数据是加载到内存中,结果也是保存到内存中, 程序执行结束,所有的数据释放。

3)文件的打开与关闭

在操作文件的整体过程与将大象放入冰箱的过程是很相似的。

  • 文件的打开
    在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。
    open(文件名,访问模式) e.g. f = open(‘test.txt’, ‘w’)
    如果文件不存在那么创建,如果存在那么就先清空,然后写入数据

  • 要读取二进制文件,比如图片、视频等等,用’rb’, ‘wb’, 'ab’等模式打开文件即可.

  • File文件的属性

Python————文件_第1张图片

2.文件的读写

1)File对象的常用方法

Python————文件_第2张图片

2)文件的打开

seek(offset, from)有2个参数:
offset:偏移量
from:方向 0:表示文件开头; 1:表示当前位置; 2:表示文件末尾

3)文件的关闭
  • 方法一: 调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,
    并且操作系统同一时间能打开的文件数量也是有限的:
  • 方法二: Python引入了with语句来自动帮我们调用close()方法:
    在这里插入图片描述
  • with语句工作原理
    python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。
4)文件的应用: 文件的备份

输入文件的名字,然后程序自动完成对文件进行备份。

import os

oldFileName = input("请输入要拷贝的文件名字:")


# 判断要拷贝的文件是否存在?如果不存在, 则报错并退出.
if not os.path.exists(oldFileName):
    print("文件 %s 不存在" % (oldFileName))
    exit(1)

with open(oldFileName, 'r') as oldFile:
    # 提取文件的后缀
    fileFlagNum = oldFileName.rfind('.')

if fileFlagNum > 0:
    fileFlag = oldFileName[fileFlagNum:]
    # 组织新的文件名字
    newFileName = oldFileName[:fileFlagNum] + '_备份' + fileFlag
else:
    newFileName = oldFileName + '_备份'

# 创建新文件
newFile = open(newFileName, 'w')
# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in oldFile.readlines():
    newFile.write(lineContent)
newFile.close()
print("文件 [%s] 备份为 [%s] 成功" % (oldFileName, newFileName))

3.os模块详解

1)关于操作系统

os,语义为操作系统,处理操作系统相关的功能,可跨平台。 比如显示当前目录下所有文件/删除某个文件/获取文件大小……

import os

# 1). 返回操作系统类型, 值为posix,是Linux操作系统, 值为nt, 是windows操作系统
print(os.name)
print('Linux' if os.name=='posix' else 'Windows')

# 2). 操作系统的详细信息
info = os.uname()
print(info)
print(info.sysname)
print(info.nodename)

# 3). 系统环境变量
print(os.environ)

# 4). 通过key值获取环境变量对应的value值
print(os.environ.get('PATH'))
print(os.getenv('PATH'))
2)关于路径
import os
import random

from os.path import exists, splitext, join
# 1. 判断是否为绝对路径---'/tmp/hello', 'hello.png', 'qq/hello.mp3'
 print(os.path.isabs('/tmp/hello'))
 print(os.path.isabs('hello'))

 # 2. 生成绝对路径
 print(os.path.abspath('/tmp/hello'))
 print(os.path.abspath('hello.png'))

 # 3. 'hello.png'
 print(os.path.join('/home/kiosk', 'hello.png'))
 # 返回一个绝对路径: 当前目录的绝对路径+ 文件名/目录名
 print(os.path.join(os.path.abspath('.'), 'hello.png'))


# 4.获取目录名或者文件名
 filename = '/home/kiosk/Desktop/201808python/day10/hello.png'
 print(os.path.basename(filename))
 print(os.path.dirname(filename))


#5. 创建目录/删除目录
 mkdir -p qq/qq1/qq1   递归创建目录
 os.makedirs('img/films')
 os.mkdir('img')
 os.rmdir('img')

# 6. 创建文件/删除文件
 os.mknod('00_ok.txt')
 os.remove('00_ok.txt')

# 7. 文件重命名(mv)
 os.rename('data.txt', 'data1.txt')


 # 8. 判断文件或者目录是否存在
 print(os.path.exists('img'))

 # 9. 分离后缀名和文件名
print(os.path.splitext('hello.png'))
print(os.path.split('hello.png'))
	
 # 10. 将目录名和文件名分离
print(os.path.split('/tmp/hello/hello.png'))
3)os模块

os模块中的rename()可以完成对文件的重命名操作。
rename(需要修改的文件名, 新的文件名)
os模块中的remove()可以完成对文件的删除操作
remove(待删除的文件名)

4)小练习: 文件批量重命名练习:
   1. 在当前目录新建目录img, 里面包含100个文件, 100个文件名各不相同(X4G5.png)
   2. 将当前img目录所有以.png结尾的后缀名改为.jpg.

代码如下:

 import string
    def gen_code(len=4):
        # 随机生成4位的验证码
        li = random.sample(string.ascii_letters+string.digits, len)
        # 将列表元素拼接为字符串
        return  "".join(li)

def create_files(dirname):
    # 随机生成100个验证码
    li = {gen_code() for i in range(100)}
    if not os.path.exists(dirname):
        os.mkdir('img')
    # # 随机生成四个数字
    for name in li:
        os.mknod(dirname +os.path.sep +  name  + '.png')

create_files('img')
 import sys
def modify_suffix(dirname, old_suffix, new_suffix):
    """
    :param dirname: 操作的目录
    :param old_suffix: 原先的后缀名
    :param new_suffix: 新的后缀名
    :return:
    """
    # 1. 判断查找的目录是否存在, 如果不存在, 显示报错
    if exists(dirname):
        # 2. 找出所有以old_suffix(.png)结尾的
        # pngfiles = [ filename for filename in os.listdir(dirname)
        #             if filename.endswith(old_suffix)]
        pngfiles = filter(lambda filename: filename.endswith(old_suffix), os.listdir(dirname))
        # 3. 将文件名和后缀名分开, 留下所有的文件名
        basefiles = [splitext(filename)[0] for filename in pngfiles]
        print(basefiles)
        # 4. 文件重命名
        for filename in basefiles:
            # 需要加上目录名
            oldname = join(dirname, filename + old_suffix)
            newname = join(dirname, filename + new_suffix)
            os.rename(oldname, newname)
            print("%s重命名为%s成功" % (oldname, newname))
    else:
        print("%s不存在, 不能操作......" % (dirname))

4.json模块详解

1)什么是json

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。

JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。

这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

2)python类型数据和JSON数据格式互相转换规则

Python————文件_第3张图片
python 中str类型到JSON中转为unicode类型,None转为null,dict对应object;
pyhton中的集合不能转成json格式。

3)数据类型编解码

在这里插入图片描述
dump:  将对象序列化并保存到文件

load:   将序列化字符串从文件读取并反序列化

4)序列化及反序列化常用参数

在这里插入图片描述
ensure_ascii=False: 中文存储需要设定
indent=4: 增加缩进,增强可读性,但缩进空格会使数据变大
separators=(’,’,’:’): 自定义分隔符,元素间分隔符为逗号, 字典key和value值的分隔符为冒号
sort_keys=True: 字典排序

5)自定义复杂数据类型编解码

例如我们碰到集合对象, datetime对象,或者自定义的类对象等json默认不支持的数据类型时,我们就需要自定义编解码函数。有两种方法来实现自定义编解码

import datetime,json

dt = datetime.datetime.now()



def time2str(obj):
    #python to json
    if isinstance(obj, datetime.datetime):
        json_str = {"datetime":obj.strftime("%Y-%m-%d %X")}
        return json_str
    return obj

def str2time(json_obj):
    #json to python
    if "datetime" in json_obj:
        date_str,time_str = json_obj["datetime"].split(' ')
        date = [int(x) for x in date_str.split('-')]
        time = [int(x) for x in time_str.split(':')]
        dt = datetime.datetime(date[0],date[1], date[2], time[0],time[1], time[2])
        return dt
    return json_obj


a = json.dumps(dt,default=time2str)
print a
 {"datetime": "2016-10-27 17:38:31"}
print json.loads(a,object_hook=str2time)
2016-10-27 17:38:31
6)pickle模块详解

python的pickle模块实现了python的所有数据序列和反序列化。与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。

cPickle是pickle模块的C语言编译版本相对速度更快。

from datetime import date
import pickle

src_dic = {"date":date.today(),"prices":{100, 20, 100, 90}}
det_str = pickle.dumps(src_dic)
print(det_str)
7)JSON和pickle模块的区别

1、JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。

2、JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。

你可能感兴趣的:(Python)