Python——文件相关操作

文件

文件是什么?

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

1.文件的操作

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件。

open(文件名,访问模式)   e.g. f = open('test.txt', 'w') 如果文件不存在那么创建,如果存在那么就先清空,然后写入数据。

在对文件进行操作之后一定要记得加 .close 把打开的文件关闭,否则相关数据结构会占用内存。

下表是对访问模式的一个简单总结:

 

访问模式

 

有无读权限

 

有无写权限

文件不存在,是否会创建文件

 

是否会清空文件

r

w

a

r+

w+

a+

下面这个图会更清晰明了:

在这里要注意指针的位置,因为指针位置会对文件后续的操作有很大的影响。

以上访问模式适用于普通文本文件,要读取二进制文件时,比如图片、视频等等,用'rb', 'wb', 'ab'等模式打开文件即可。

下面看几个常用的文件对象的属性:

对文件的操作的一个简单案例就是实现拷贝文件,拷贝文件的思路如下:

  1.  判断拷贝的文件是否存在?
  2.  如果存在, 将源文件的内容读出来, 写入目标文件中。

具体操作如下:

import  os
def copy(source_file, dst_file):
    """
    实现拷贝文件的操作
    思路:
        cp /etc/passwd /etc/hello
        1. 判断拷贝的文件是否存在
        2. 如果存在, 将源文件的内容读出来, 写入目标文件
    """
    if os.path.exists(source_file):
        # 将源文件的内容读出来
        f = open(source_file)
        content = f.read()
        f.close()
        # 写入目标文件
        dst_f = open(dst_file, 'w')
        dst_f.write(content)
        dst_f.close()
        print("拷贝%s为%s成功" %(source_file, dst_file))
    else:
        print("源文件%s不存在" %(source_file))
copy('/etc/passwd', 'doc/passwd-备份')

2.文件的读写操作

文件对象的几个常用方法如下:

接下来分别对它们进行说明:

1)移动指针的位置(定位)

seek(offset, from)有2个参数:

offset:偏移量

from:方向   0:表示文件开头;1:表示当前位置;2:表示文件末尾

比如说: f.seek(0,2)表示从文件开头的位置向右移动两个字节。

 

还有一个 .tell ,它可以输出当前指针的位置。形式为:print(f.tell()),输出打印指针在第几个字节处。

2)读操作

通过 .read 实现对文件的读操作,会读取文件的全部内容。

但是如果当文件的很大时,一次性读取它的全部内容,这显然是不妥的,所以这时要用到 .readline 去读取文件。

.readline 可以每次读取文件一行的内容,这样就不会占用太大的内存,然后通过循环语句就可以一行一行的把文件读取出来了。

代码如下:

f = open(filename, 'r')
while True:
     # 每次只读取一行内容, 如果不能读取到内容, break跳出;
     content = f.readline()
     if not content:
         break
     else:
         print(content, end='')

还有 .readlines 也类似,它是每次读取文件的多行内容。

3)写操作

通过 .write 方式对文件进行写操作,它会把内容以字符串的方式写入文件中。

形式为:f.write("写入文件内容")

.writelines 可以将列表中的所有元素写入文件中去。

形式为:f.writelines(['第一个\n', '第二个\n'])

4)文件的关闭

关闭文件有两种方法:

方法一:调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源, 并且操作系统同一时间能打开的文件数量也是有限的。

方法二: Python引入了with语句来自动帮我们调用close()方法,形式如下:

with语句工作原理:

python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会自动执行规定的(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。


3.OS模块详解

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

1)os模块系统信息获取

import os

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

# 2). 操作系统的详细信息
detail_info = os.uname()
print(detail_info)
print("主机名:", detail_info.nodename)
print("硬件架构:", detail_info.machine)
print("系统名称:", detail_info.sysname)
print("Linux内核的版本号:", detail_info.release)

# 3). 系统环境变量等价于Linux的env命令
print(os.environ)

# 4). 通过key值获取环境变量对应的value值
print(os.environ['PATH'])

2)文件目录的操作

关于路径的:

关于文件目录的:


4.json和pickle模块详解

1)JSON模块

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

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

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

python类型数据和JSON数据格式互相转换规则如下:

                         

有几点要重点注意:

python 中str类型到JSON中转为unicode类型,None转为null,dict对应object;

pyhton中的集合不能转成json格式。

JSON数据类型编解码:

还有两个:

.dump: 将对象序列化并保存到文件

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

下面看一下序列化及反序列化常用参数:

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,

    allow_nan=True, cls=None, indent=None, separators=None,

    encoding="utf-8", default=None, sort_keys=False, **kw)

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

举例如下:

2)pickle模块

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

pickle序列化(编码): python对象编码成pickle的bytes类型数据

pickle反序列化(解码): 将pickle的bytes类型数据转成python对象

JSON和pickle模块的区别:

  1. JSON只能处理基本数据类型。pickle能处理所有Python的数据类型。
  2. JSON用于各种语言之间的字符转换。pickle用于Python程序对象的持久化或者Python程序间对象网络传输,但不同版本的Python序列化可能还有差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值