如何文件操作-程序员宅基地

技术标签: 操作系统  

今日内容
1.什么是文件
2.为何用文件
3.如何用文件
4.文件操作补
5.常用方法
6.文件内指针的移动
7.with的使用
4. 文件操作

 

4.1 主模式
r:只读模式L(默认)
    当文件不存在时,会报错
    当文件存在时,文件指针指向文件的开头

w:只写模式
    当文件不存在时,新建一个空文档
    当文件存在时,清空文件内容,文件指针跑到文件的开头

    info = ['egon:123\n','alex:456\n','lxx:lxx123']
    f.writelines(info) #将列表里面的数据,一行行的写进去(自动换行)

a:追加 写模式
    当文件不存在时,新建一个空文档,文件指针跑到文件的末尾
    当文件存在时,文件指针跑到文件的末尾

    在文件打开不关闭的情况下,连续的写入,下一次写入一定是基于上一次写入指针位置而继续的
    f.write()
    f.writelines()

  

4.2 文件操作从模式(必须与r/w/a连用
t:文本模式(默认的),一定指定encoding参数
    优点:操作系统会将硬盘中的二进制数字解码成Unicode然后返回
    强调:只针对文本文件有效

b:二进制模式:一定不能指定encoding参数
    优点: 

+:可读可写

r+: 不会创建文件的可读可写 
w+:创建清空文件的可读可写 
a+:创建不清空文件(追加)的可读可写
rb: 二进制读 
wb:创建清空文件的二进制写  
ab: 创建不清空文件(追加)的二进制写
rb+ | wb+ | ab+

# ps: x:写模式,创建文件,如果文件以存在,就抛异常
with open('000.txt', 'x', encoding='utf-8') as f:
    pass

  4.3 案例

# 需求:
# 1.完成文本类型的文件复制:1.txt => 11.txt
r = open('1.txt', 'r', encoding='utf-8')
w = open('11.txt', 'w', encoding='utf-8')
for line in r:  # 遍历就是一行一行读 取读文件的流
    w.write(line)
    w.flush()
w.close()
r.close()

  

5. 常用方法
#掌握
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中

f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式
f.flush() #立刻将文件内容从内存刷新到硬盘

  #了解

f.readable() #文件是否可读
f.writable() #文件是否可读

6.2 案例: 游标操作

# 方法:seek(偏移量, 偏移位置)
# 偏移量:移动的字节数,负数是结合模式1,2往前偏移
# 偏移位置:
#   -- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移
# b'你好1234567890'

#游标读
with open('source.txt', 'rb') as f:
    d1 = f.read(11)
    print(d1)
    # print(d1.decode('utf-8'))

    # 当前游标的位置
    print(f.tell())

    # 游标操作 - 从末尾位置开始
    f.seek(-3, 2)
    d2 = f.read()
    print(d2.decode('utf-8'))  # 890

    # 游标操作 - 从当前位置开始
    f.seek(-3, 1)
    d2 = f.read()
    # print(d2.decode('utf-8'))  # 34567890

    # 游标操作 - 从头开始
    f.seek(3, 0)
    d2 = f.read()
    # print(d2)
    print(d2.decode('utf-8'))  # 好1234567890

游标写:会覆盖书写
with open('source.txt', 'rb+') as f:
    f.seek(11)
    # print(f.read())
    f.write(b'000')

  6.3 百度网盘秒传分析

# 方法:seek(偏移量, 偏移位置)
# 偏移量:移动的字节数,负数是结合模式1,2往前偏移
# 偏移位置:
#   -- 0 - 从文件开始位置开始偏移 | 1 - 从当前游标位置开始偏移 | 2 - 从文件末尾开始偏移
# b'你好1234567890'

#游标读
with open('source.txt', 'rb') as f:
    d1 = f.read(11)
    print(d1)
    # print(d1.decode('utf-8'))

    # 当前游标的位置
    print(f.tell())

    # 游标操作 - 从末尾位置开始
    f.seek(-3, 2)
    d2 = f.read()
    print(d2.decode('utf-8'))  # 890

    # 游标操作 - 从当前位置开始
    f.seek(-3, 1)
    d2 = f.read()
    # print(d2.decode('utf-8'))  # 34567890

    # 游标操作 - 从头开始
    f.seek(3, 0)
    d2 = f.read()
    # print(d2)
    print(d2.decode('utf-8'))  # 好1234567890

游标写:会覆盖书写
with open('source.txt', 'rb+') as f:
    f.seek(11)
    # print(f.read())
    f.write(b'000')
6.3 百度网盘秒传分析
# 案例
#以图片为例,按照一定规则从文件中摘取一些数据,
#加工后通过与服务器端数据进行对比,如果数据一样则不需要传输,
#直接将服务器内文件地址给用户即可
with open('001.png', 'rb') as f:
    data = f.read()
print(len(data))

# 在大文件中,开头| 1/3 | 2/3 | 末尾 各取10个字节拼接成秒传的信息依据
# 形成秒传规则
tagData = b''
with open('001.png', 'rb') as f:
    # 通过其他途径(sys模块)来获取文件总大小
    data = f.read()
    length = len(data)
    # 开头
    f.seek(0, 0)
    d1 = f.read(10)
    # 1/3
    f.seek(length // 3, 0)
    d2 = f.read(10)
    # 2/3
    f.seek(length // 3 * 2, 0)
    d3 = f.read(10)
    # 末尾
    f.seek(-10, 2)
    d4 = f.read(10)
    tagData = d1 + d2 + d3 + d4
# 秒传依据
print(tagData)

newData = b""
with open('001.png', 'rb') as f:
    data = f.read()
    length = len(data)
    f.seek(0, 0)
    newData += f.read(10)
    f.seek(length // 3, 0)
    newData += f.read(10)
    f.seek(length // 3 * 2, 0)
    newData += f.read(10)
    f.seek(-10, 2)
    newData += f.read(10)

if newData == tagData:
    print('秒传成功')
else:
    print('慢慢传去吧')

  

7. with:将文件的释放交给with管理
7.1 使用方法
with open('1.txt', 'r', encoding='utf-8') as r,\
    open('source.txt', 'w', encoding='utf-8') as w:
    for line in r:
        w.write(line)
        w.flush()
    # w.close() 系统自动完成
    # r.close()

  7.2 案例

#完成文本文件的赋值
# 边读边写赋值
with open('source.txt', 'r', encoding='utf-8') as f1:
    with open('target.txt', 'a+', encoding='utf-8') as f2:
        for line in f1:
            f2.write(line)
#完成非文本文件的赋值
# 非文本文件,使用二进制读写,不设置encoding
with open('333.mp4', 'rb') as f1:  
    with open('666.mp4', 'wb+') as f2:
        for line in f1:
            f2.write(line)

  

转载于:https://www.cnblogs.com/mofujin/p/10611616.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30861459/article/details/96725666

智能推荐

动态LINQ Where子句-PredicateBuilder-程序员宅基地

这不是一篇完整的文章,只是一个速写。 但是,我不能错过分享这个观点的人的机会,因为它使我的编码生命sooooooo容易得多。 http://www.albahari.com/nutshell/predicatebuilder.aspx 它的用处取决于情况,但是当我构建搜索应用程序时,我发现它最有价值。 我不知道用户可能在搜索中包括哪些参数。 我不想建立一个select语句,因为我已经创建了L...

机器学习--随机梯度下降_python中def fit(self, x, y):-程序员宅基地

机器学习–随机梯度下降随机梯度下降大规模机器学习,批量梯度下降运算成本较高,使用随机梯度下降能优化运算成本,收敛更快Python实现Adaline算法,随机梯度下降import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.colors import ListedColormapfrom sklearn import datasetsclass AdalineSGD(object): def __init_._python中def fit(self, x, y):

1148 Werewolf - Simple Version (20 分)-程序员宅基地

1148Werewolf - Simple Version(20分)Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and the human beings. Suppose that in a game,player #1 said: "Pla...

websocket 聊天室 demo ( tornado + nginx + wss + 在线demo)_在线websocket demo-程序员宅基地

在线demo(已停止服务)前端代码(来源网友,自己稍作修改):<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title> WebSocket ChatRoom </title> <style..._在线websocket demo

Layui之layer.confirm询问框,是否重置_layer.confirm重写-程序员宅基地

if (even == "reset") {//重置的按钮 layer.confirm('重置该用户的密码?此操作不可逆,是否继续?', { title: '重置密码', btn: ['是的', '容我考虑一下'], //按钮 anim: 2, offset: '100px' },function (){ ._layer.confirm重写

随便推点

react interview 面试-程序员宅基地

React 面试问题如果你是一位有理想的前端开发人员,并且正在准备面试,那么这篇文章就是为你准备的。本文收集了 React 面试中最常见的 50 大问题,这是一份理想的指南,让你为 React 相关的面试做好充分的准备工作。首先我们快速了解一下 React 在市场上的需求和现状,然后再开始讨论 React 面试问题。JavaScript 工具的市场地位正在缓慢而稳定地上升当中,而对 Rea..._react interview

vue项目开发---初始化项目以及使用gitee托管_gitee 初始化vue_小码哥呀的博客-程序员宅基地

1、使用CLI3创建项目vue create 项目名称上图提示目前系统安装脚手架版本是2.9.6。所以需要先卸载老版本脚手架,再安装对应新版本脚手架。//卸载脚手架npm uninstall -g @vue/cli//安装指定版本脚手架npm install -g @vue/[email protected]如果安装过程中遇到如下错误:只用找到本地用户的目录C:\用户\Lenoev下 找到一个.vuerc 的文件删掉就OK了2、将本地项目与远程仓库建立一个链接2.1、以下操作前提是在git_gitee 初始化vue

BigDecimal使用踩坑记录-程序员宅基地

BigDecimal在Java编程中,非常实用,在算钱的时候,哪怕精度丢了一丢丢都让人头疼,所以一般我们不采用float类型和double来做货币计算。System.out.println(0.05 + 0.01); //0.060000000000000005System.out.println(1.0 - 0.66); //0.33999999999999997Syst..._defect: bigdecimal constructed from 0.1274

php curl 错误 cURL error 60-程序员宅基地

为什么80%的码农都做不了架构师?>>> ...

文章列表分页+二级导航-程序员宅基地

文章列表分页访问/article/list-:page.html//截取数据select * from article order by id desc limit ?,3 截取3个数据// 分页列表router.get('/article/list-:page.html',(req,res)=>{ console.log(req.params); sql('select *

40-正则表达式_正则表达式 40-56-程序员宅基地

正则表达式  通过一系列分析发现String是一个非常万能的类型,因为String不仅仅可以支持字符串的处理操作,也支持有向各个数据类型的转换支持,所以在项目开发中,只要是用户输入的信息基本上都用String表示。于是再向其他数据类型转换时,为了保证转换的正确性,需要对其进行复杂的验证处理,如果只是单纯的依靠String类中的方法是非常麻烦的。认识正则表达式  假设有一个字符串,要求判断是否由数字组成,如果由数字组成,则将其变为数字进行乘法计算。字符串转数字public class RegexSt_正则表达式 40-56