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. 用python分析1225万条淘宝数据,终于搞清楚了我的交易行为

    大家好,我是黄同学

  2. GitLab Admin Area 500 Error

    GitLab Admin Area 500 Error GitLab Admin Area Settings 菜单全部报错 500 解决方法 执行: gitlab-rake cache:clear # ...

  3. Good-turning估计

    在学习NLP过程中,遇到了Good-turning的介绍,网上找了相关的资料查看,总结如下. 思想: 其主要思想是从概率的总量中分配少量的比例给零概率项. 思路: 假定给定的语料库中出现 \(r\)次 ...

  4. Vue + ccropper.js裁切图片(vue-cropper)

    按原比例裁剪图片并且不失真. 安装: cnpm install vue-cropper --save-dev 使用: <template> <div style="disp ...

  5. 剑指offer之字符串是否为数值

    1. 题目 这是<剑指offer>上的一道题,刚开始觉得这是一道挺简单的题目,后来发现自己太年轻了,考虑的因素太少了,思考了而是分钟还是无从下手,看了作者的思路深深被他折服了,题目如下: ...

  6. 我搭的神经网络不work该怎么办!看看这11条新手最容易犯的错误

    1. 忘了数据规范化 2. 没有检查结果 3. 忘了数据预处理 4. 忘了正则化 5. 设置了过大的批次大小 6. 使用了不适当的学习率 7. 在最后一层使用了错误的激活函数 8. 网络含有不良梯度 ...

  7. salesforce零基础学习(九十九)Git 在salesforce项目中的应用(vs code篇)

    本篇参考: https://code.visualstudio.com/docs/editor/versioncontrol https://git-scm.com/doc https://git-s ...

  8. html定时跳转页面

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. C#LeetCode刷题之#459-重复的子字符串(Repeated Substring Pattern)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3945 访问. 给定一个非空的字符串,判断它是否可以由它的一个子串 ...

  10. K均值聚类和DBSCAN介绍

    K均值(K-means)聚类 问题定义:给定数据$\vec{x}_1,\vec{x}_2,\cdots,\vec{x}_n$,将它们分到不同的$K$个簇(cluster)中.定义$\vec{c}=(c ...