1.文件操作概述

# 文件是用于数据存储的单位通常用来长期存储设置,文件中的数据是以字节为单位进行顺序存储的
    1.打开文件: f = open("xxx") 或 with open("xxx") as f: pass

    2.读写文件: 读(f.read),写(f.write)

    3.关闭文件: f.close()

2.文件的打开函数 open

# 用于打开一个文件,打开成功返回文件流对象(文件句柄),如果打开失败会出发IOError异常

    # 打开文件不指定encoding参数时默认以当前平台的编码打开

    f = open(file, mode='rt', encoding='utf-8')

3.文件的打开方式

r:

        默认模式,以只读方式打开文件,文件不可写,打开的文件不存在会报错

        文件的指针会放在文件的开头

    rb:

        默认模式,以二进制格式以只读方式打开一个文件,文件不可写,打开的文件不存在会报错

        文件的指针会放在文件的开头

    r+:

        以读写的方式打开文件,写入内容为str类型,打开的文件不存在会报错

        文件的指针会放在文件的开头,重新写入的内容从头开始替换

    rb+:

        以二进制格式的读写方式打开一个文件,可写入内容为bytes类型,打开的文件不存在会报错

        文件的指针会放在文件的开头,重新写入的内容从头开始替换

    w:

        以只写的方式打开文件,写入内容为str类型,文件不可读

        如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件

    wb:

        以二进制格式的只写方式打开一个文件,写入内容为bytes类型,文件不可读

        如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件

    w+:

        以读写的方式打开文件,写入内容为str类型

        如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件

    wb+:

        以二进制格式的写读方式打开一个文件,写入内容为bytes类型

        如果文件已存在则将其覆盖,原文件内容清空,文件不存在则创建新的文件

    a:

        以追加(只写)的方式打开一个文件,写入内容为str类型

        如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件

    ab:

        以二进制格式的追加(只写)方式打开一个文件,写入内容为bytes类型

        如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件

    a+:

        以追加(读写)的方式打开一个文件,写入内容为str类型

        如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件

    ab+:

        以二进制格式的追加(读写)的方式打开一个文件,写入内容为bytes类型

        如果文件已存在文件指针将会放在文件的结尾,新的内容将会写入到已有内容,文件不存在则创建新的文件

4.文件的关闭方法

f.close()  # 关闭文件操作符,释放系统资源

    # 用上下文管理器打开的文件无需关闭,因为上下文管理器内容实现了关闭文件的方法

    with open("文件路径", mode="rt", encoding="utf-8") as f:

        pass

5.文件操作的两种类型(文本文件/二进制文件)

1.文本文件操作打开模式: 't'

        1.默认文件中存储的内容为字符串数据,以行为单位读取采用系统的换行符进行分隔,对于文本文件需要用字符串(str)进行读取和写入数据

        2.各种操作系统默认的换行符:

            Linux换行符: '\n'

            Windows换行符: '\r\n'

            旧的Macintosh换行符: '\r'

            新的Mac OS换行符: '\n'

    2.二进制文件操作打开模式: 'b'

        1.默认文件中存储都是以字节为单位的二进制数据,需要以字节为单位进行读取,二进制文件的读写需要用字节串进行读写

        2.二进制文件读操作

            f.read(n)  # 返回字节串,n代表最大字节数

            f.readline()  # 返回一行字节串

            f.readlines()  # 返回字节串列表

        3.二进制文件写操作

            f.write(x)  # 写入内容x为字节串

            f.seek(offset, whence=0)

                offset偏移量: 大于0的数代表向文件末尾移动,小于0代表向文件头方向移动

                whence相对位置

                    0: 代表从文件头开始偏移

                    1: 代表从当前位置开始偏移

                    2: 代表从文件尾开始偏移,从尾部偏移时offset参数必须为负数

        4.示例:

        f = open("./测试文本/README", mode="rb")  # 以二进制的方式打开只读文件时不能指定编码

        data = f.read()

        # "字节串"--->encode--->bytes

        # bytes--->decode--->"字节串"

        print(data)

        print(data.decode("utf-8"))

        f.close()

f = open("./测试文本/README", mode="wb")  # 以二进制的方式打开只写文件时不能指定编码

        f.write(bytes("abc\r\n", encoding="utf-8"))

        f.write("你好".encode("utf-8"))

        f.close()

6.文件操作-读(read, readable, readline, readlines)

read(n): 读取文件内容,参数n代表读取最大字符数(b模式下为字节数),不写参数表示读取所有内容

    readable: 判断文件是否可读,可读返回True,否则返回False

    readline: 读取一行内容

    readlines: 读取所有文件内容保存到列表,包含不显示的字符

    示例:

        # encoding指定以什么编码来读取文件内容

        # r:以只读方式打开文件,w:以只写方式打开文件,a:以追加方式打开文件,默认以rt方式打开文件

        f = open("./测试文本/README", encoding="utf-8")

        print(f.readable())  # 判断文件是否可读

        print(f.readline())  # 读取一行内容,每次读取出来的数据都会有一个\n

        print(f.readlines())  # 读取所有文件内容保存到列表,包含不显示的字符

        f.close()  # 关闭文件句柄

7.文件操作-写(write, writable, writelines, flush)

write: 写入所有内容

    writable: 判断文件是否可写,可写返回True,否则返回False

    writelines: 以列表内容写,列表元素为字符串

    flush: 刷新缓存

    示例:

        f = open("./测试文本/README", mode="w", encoding="utf-8")

        f.write("hello world!")  # 写入所有内容

        print(f.writable())  # 判断文件是否可写

        f.writelines(["11\n", "22"])  # 以列表内容写,列表元素必须是字符串

        f.flush()  # 刷新缓存

        f.close()

8.文件操作-操作完成自动关闭文件

with open("./测试文本/README", encoding="utf-8") as f:

        msg = f.read()

        print(msg)

9.文件操作-复制

# 1.打开文件

    file_read = open("./测试文本/README")

    file_write = open("./测试文本/README[复件]", mode="w")

    # 2.读写文件

    while True:

        # 读取一行内容

        test = file_read.readline()

        # 判断是否读到内容

        if not test:

            break

        file_write.write(test)

    # 3.关闭文件

    file_read.close()

    file_write.close()

10.文件的其他操作

f = open("./测试文本/test1", mode="w", newline="\n")  # 指定newline读取文件时的换行符

    print(f.closed)  # 判断文件是否关闭

    print(f.encoding)  # 查看文件的编码

    f.flush()  # 将写在内存中的数据刷到文件中保存

    print(f.tell())  # 显示光标所在的位置,光标的移动以字节为单位

    f.seek(0)  # 将光标移动到第0个位置,光标的移动以字节为单位

    f.seek(3, 0)  # 第二个参数表示从哪个位置开始偏移默认时0表示从0位置开始;1:相对位置;2:倒叙,倒叙时第一个参数为负数

    f.truncate(pos = None)  # 剪掉自pos位置之后的数据,返回新的文件长度(字节为单位)

    f.tall()  # 返回当前文件流的绝对位置

    f.seekable()  # 返回这个文件对象是否支持随机定位

    示例:

        # r+模式默认情况下光标在开头,若要保留文件原本类容必须先读后写,若文件不存在则报错

        f = open("./测试文本/test2", mode="r+", encoding="utf-8")

        s = f1.read()

        f.write("111")

        f.flush()

        f.close()

# w+操作会清空原来的内容,可读可写,若文件不存在则创建文件

        f = open("./测试文本/test3", mode="w+", encoding="utf-8")

        f.write("222")

        f.flush()

        f.seek(0)

        s = f.read()

        print(s)

        f.close()

11.文件操作-读日志文件

'''./测试文本/日志文件
2019年3月17日: 11111
2019年3月18日: 22222
2019年3月19日: 33333
2019年3月20日: 44444
2019年3月21日: 55555
'''
f = open("./测试文本/日志文件", mode="rb")
for i in f:
offs = -5
while True:
f.seek(offs, 2) # 将文件光标移动到-5位置
data = f.readlines() # 读取所有文件内容保存到列表
# 判断是否有完整的一行
if len(data) > 1:
print("文件的最后一行是:%s" % data[-1].decode("utf-8"))
break
offs *= 2
f.close()

读日志文件:

12.文件操作-人口普查示例

'''./测试文本/人口普查
{"name": "北京", "population": 5000}
{"name": "上海", "population": 10000}
{"name": "广州", "population": 40000}
{"name": "成都", "population": 15000}
{"name": "香港", "population": 30000}
'''
# 要求: 取人口总数
def get_population():
with open("./测试文本/人口普查", mode="r", encoding="utf-8") as f:
for i in f:
yield i p1 = get_population()
g1 = get_population()
# 取单个市人口数
# s1 = eval(g1.__next__())["population"]
# print(s1) # for循环遍历人口-->不推荐使用,大数据时效率低,内存占用高
# for p in g1:
# p_dic = eval(p)
# print(p_dic["population"]) # 生成器原理获取总人口数-->推荐使用表达式,大数据时效率高,内存占用小
all_pop = sum(eval(j)["population"] for j in g1)
print("人口总数:%s" % all_pop) # 生成器原理获取指定城市人口数的占比
def zyl_pop(name):
p1_pop = (eval(j)["population"] for j in p1 if eval(j)["name"] == name)
return p1_pop.__next__() / all_pop name = "上海"
s2 = zyl_pop(name)
print("%s的人口占全国人口的%.4f%%" % (name, s2*100))

人口普查示例:

05_Python的文件操作的更多相关文章

  1. 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档

    .net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...

  2. 野路子出身PowerShell 文件操作实用功能

    本文出处:http://www.cnblogs.com/wy123/p/6129498.html 因工作需要,处理一批文件,本想写C#来处理的,后来想想这个是PowerShell的天职,索性就网上各种 ...

  3. Node基础篇(文件操作)

    文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...

  4. 归档NSKeyedArchiver解归档NSKeyedUnarchiver与文件管理类NSFileManager (文件操作)

    ========================== 文件操作 ========================== 一.归档NSKeyedArchiver 1.第一种方式:存储一种数据. // 归档 ...

  5. SQL Server附加数据库报错:无法打开物理文件,操作系统错误5

    问题描述:      附加数据时,提示无法打开物理文件,操作系统错误5.如下图: 问题原因:可能是文件访问权限方面的问题. 解决方案:找到数据库的mdf和ldf文件,赋予权限即可.如下图: 找到mdf ...

  6. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  7. Linux文件操作的主要接口API及相关细节

    操作系统API: 1.API是一些函数,这些函数是由linux系统提供支持的,由应用层程序来使用,应用层程序通过调用API来调用操作系统中的各种功能,来干活 文件操作的一般步骤: 1.在linux系统 ...

  8. C语言的fopen函数(文件操作/读写)

    头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:    FILE * fopen(const char * path, c ...

  9. Python的文件操作

    文件操作,顾名思义,就是对磁盘上已经存在的文件进行各种操作,文本文件就是读和写. 1. 文件的操作流程 (1)打开文件,得到文件句柄并赋值给一个变量 (2)通过句柄对文件进行操作 (3)关闭文件 现有 ...

随机推荐

  1. CSS表单与数据表(下)

    2.表单 表单是用户输入内容的地方.表单涉及的控件很多,而且一直很难给它们应用样式.无法控制样式的部分,可以通过自定义控件来解决. 2.1 简单的表单 2.1.1 fieldset与legend fi ...

  2. 性能分析(6)- 如何迅速分析出系统 CPU 的瓶颈在哪里

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 在做性能测试时,我们会需要对 Linux 系 ...

  3. DPL,RPL,CPL 之间的联系和区别

    CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位. RPL说明的是进程对段访问的请求权限(Request P ...

  4. python 文件读写with open模式r,r+,w,w+,a,a+的区别

    模式 可做操作 若文件不存在 是否覆盖 r 只能读 报错 - r+ 可读可写 报错 是 w 只能写 创建 是 w+ 可读可写 创建 是 a 只能写 创建 否,追加写 a+ 可读可写 创建 否,追加写

  5. Python 为什么要在 18 年前引入布尔类型?且与 C、C++ 和 Java 都不同?

    花下猫语:在上一篇<Python 为什么能支持任意的真值判断? >文章中,我们分析了 Python 在真值判断时的底层实现,可以看出 Python 在对待布尔值时,采用了比较宽泛的态度.官 ...

  6. Java中的注解及自定义注解你用的怎么样,能不能像我这样应用自如?

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  7. shell bash配置

    bash主要可以分为两种方式启动(login,no-login) 两种方式所读取的配置文件不同,所以环境不同 login形式启动如下图所示: no-login形式启动: 从 ~/.bashrc开始.

  8. CAP 3.1 版本发布通告

    前言 今天,我们很高兴宣布 CAP 发布 3.1 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了 4000 Star. CAP 3000 Star 还是去年8月份的时候,最 ...

  9. three.js 利用uv和ThreeBSP制作一个快递柜

    最近有three网友,问我要不要学习blender,其实我感觉学习一下也无妨,不过花大量时间精通,尚可不必,术业有专攻给别人留一条路吧,哈哈.那我我们就是用ThreeBSP和uv贴图的知识来制作一个定 ...

  10. linux驱动之模块化驱动Makefile

    本文摘自http://blog.csdn.net/lufeiop02/article/details/6446343 Linux驱动一般以模块module的形式来加载,首先需要把驱动编译成模块的形式. ...