1、绝对路径与相对路径

path1 = "D:\orders.txt"  # 绝对路径:包含根地址的路径
path2 = "homework.py" # 相对路径:相对当前文件所在目录的地址

2、文件读取

 bj = open(path1, 'r', 1, 'utf-8')  # 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式.
# ---> 如果文件不是utf-8编码,有中文的情况下会报错。如用gb2132写入中文,用utf-8打开就会报错,但是一个字节可以表示的字符,不报错!
print(obj.read())
obj.close() # 完成后要关闭对象 # 对应的二进制模式
obj_b = open(path1, 'rb', 1) # 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
print(obj_b.read().decode()) # 一开始用的字符串的encode方法,还要将bytes转为字符串,然后再encode,结果还是字节码,应该是文件对象解码才对!
obj_b.close() # 升级版读取"+":可以读写
obj_plus = open(path1, 'r+', 1, 'utf-8') # 打开一个文件用于读写。文件指针将会放在文件的开头。
print(obj_plus.read() + '=' * 100)
obj_plus.write('我是使用升级版读取:r+模式写入的内容\n')
obj_plus = open(path1, 'r+', 1, 'utf-8') # 不加,看不到写入的效果!
print(obj_plus.read())
obj_plus.close() obj_b_plus = open(path1, 'rb+', 1) # 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
print(obj_b_plus.read().decode())
a_num = obj_b_plus.write('我是使用升级版读取:rb+模式写入的内容\n'.encode('utf-8'))
print(a_num)
obj_b_plus.close()

3、文件写入

 obj1 = open(path2, 'w', -1, 'utf-8')  # 如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a_num = obj1.write('#We all love beautiful girl!')
print(a_num)
obj1.close() # 对应的二进制模式
obj1_b = open(path2, 'wb', 1) # 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a_num = obj1_b.write(' # 我们是二进制的代码,即字节码'.encode("utf-8"))
print(a_num) # 写入的字节数
obj1_b.close() # 写入升级 +
obj1_plus = open(path2, 'w+', -1, 'utf-8') # 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a_num = obj1_plus.write('#PLUS WRITE !')
print(a_num)
print(obj1_plus.read() + "+" * 50) # 可以读了,可是没内容,原因可能是光标在最后,没读到
obj1_plus.close() obj1_b_plus = open(path2, 'wb+', -1) # 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a_num = obj1_b_plus.write(' # 0000000000000001字节码 wb+模式写入'.encode("utf-8"))
print(a_num)
print(obj1_b_plus.read()) # 可以读了,可是没内容,原因可能是光标在最后,没读到 设置光标位置:obj1_b_plus.seek(0)
obj1_b_plus.close()

4、文件追加

 obj2 = open(path2, 'a', -1, 'utf-8')  # 如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
obj2.write('--> 我们都爱美女!')
obj2.close() # 对应的二进制模式
obj2_b = open(path2, 'ab', -1) # 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a_num = obj2_b.write('--> 二进制的追加内容在此!'.encode('utf-8'))
print(a_num)
obj1_b.close() # 追加升级 +
obj2_plus = open(path2, 'a+', -1, 'utf-8') # 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
obj2_plus.write('--> 我们升级版的追加 a+ 模式!')
print(obj2_plus.read()) # 可以读了,可是没内容,原因可能是光标在最后,没读到 设置光标位置:obj2_plus.seek(0)
obj2_plus.close() obj2_b_plus = open(path2, 'ab+', -1) # 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
a_num = obj2_b_plus.write('--> 模式 ab+'.encode('utf-8'))
print(a_num)
print(obj2_b_plus.read()) # 可以读了,可是内容不全,原因可能是光标位置,设置光标位置:obj2_b_plus.seek(0)
obj2_b_plus.close()

5、相关功能详解

(1) 文件定位 即确定光标所在位置

  1)、tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。

obj_o = open(path1, 'r+', -1, 'utf-8')
position = obj_o.tell()
print("当前文件位置 : {0}".format(position))

  2)、seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。

obj_o.seek(100)  # 是按照字节定光标的位置,
print(obj_o.read()) # --> 分析:由于r模式下,光标是放在开头部分,即在0字节出,这里偏移100个字节,即第101个字节开始读到最后!
# 用editplus打开,选中未打印的部分,刚好是100个字节:此时光标在尾部!

(2)读取文本中的行数据,一行或者多行

obj_o.seek(0)   # 光标不归零,读不了数据
print(obj_o.readline())
print(obj_o.readline(2)) # 读一行的两个字节数据 '''实际生产环境z中,不能将文件的数据一下都读取出来,因为你也不知道文件有多大!有爆仓的危险!
建议:一行一行读,或一段一段读'''
for line in obj_o.readlines(): # 每一行当成列表中的一个元素,添加到list中,
print(line)

(3)其他方法
   0)是否可读

print(obj_o.readable())  # 是否可读

  1)truncate() 用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除,其中 Widnows 系统下的换行代表2个字节大小。 。

print(obj_o.truncate(193)) # 截短,缩短,删节(尤指掐头或去尾),报错,将模式改为r+  返回的是截取的字节长度,结果看文

6、提倡使用的的文件打开,进行操作的方式:with open as 优点是,不用close了!

with open(path1, mode='r+', encoding='utf-8') as f1,\
open("new_file.txt", mode='w+', encoding='utf-8') as f2:
print(f1.read())
print(f2.read())

7、使用读取文件的方式,改造如下需求:

'''
用户登陆(三次输错机会)且每次错误时显示剩余的错误次数(提示:使用字符串格式化)
'''
# 只执行一次的,写入原始数据:登录名和密码
# with open('sn.txt', mode='wb+') as sn_f:
# sn_f.write('zhangsan\t123\n'.encode('utf-8'))
# sn_f.write('lisi\t123\n'.encode('utf-8'))
# sn_f.write('wangwu\t123\n'.encode('utf-8'))
# -todo 改上面的代码简单实现注册功能
i = 0
while i < 3:
i += 1
name = input("请输入您的登录名:").strip()
passwd = input("请输入您的密码:").strip()
with open('sn.txt', mode='r+', encoding='utf-8') as sn_f1:
names = sn_f1.readlines()
print(names)
str_sn = name + '\t' + passwd + '\n'
if str_sn in names:
print("登陆成功!")
break
else:
print("您的登录名或者密码不正确!您还有%s次输入机会!" % str(3 - i))
# -todo 改上面的代码,除去\t \n 符号,用列表保存用户名和密码
												

python基础之九:文件操作的更多相关文章

  1. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  2. Python基础-week03 集合 , 文件操作 和 函数详解

    一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...

  3. python基础八之文件操作

    python的文件操作 1,打开文件 编码方式要和文件的编码方式相同! #open('路径','打开方式','指定编码方式') f = open(r'E:\pycharm\学习\day8\test', ...

  4. Python基础7:文件操作

    [ 文件操作] 1 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下: 昨夜寒蛩不住鸣. 惊回千里梦,已三更. 起来独自绕阶行. 人悄悄,帘外月胧 ...

  5. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

  6. Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数

    1.        集合 1.1      特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...

  7. python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: #/usr/bin/env ...

  8. python基础学习笔记——文件操作

    文件操作 初始文件操作 使用Python来读写文件是非常简单的操作,我们使用open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了 根据打开方式的不同能够执行的操作 ...

  9. Python基础知识(八)----文件操作

    文件操作 一丶文件操作初识 ###f=open('文件名','模式',编码): #open() # 调用操作系统打开文件 #mode #对文件的操作方式 #encoding # 文件的编码格式 存储编 ...

  10. Python基础之 一 文件操作

    文件操作 流程: 1:打开文件,得到文件句柄并赋值给一个变量 2:通过句柄对文件进行操作 3:关闭文件 模式解释 r(读) , w(写) ,a(附加)r+(读写的读), w+(读写的写),a+(读附加 ...

随机推荐

  1. Harbor 忘记密码

    Harbor密码重置 01,登入到harbor容器里面的数据库上 docker exec -it harbor-db /bin/bash 02,登入数据库 psql -h postgresql -d ...

  2. 应用层协议:HTTP

    1. HTTP定义 HyperText Transfer Protocol,超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络 ...

  3. nacos服务注册与发现及服务配置实现

    Nacos 提供了一组简单易用的特性集,可快速实现动态服务发现.服务配置.服务元数据及流量管理. 更敏捷和容易地构建.交付和管理微服务平台. 关键特性: 服务发现和服务健康监测 动态配置服务 动态 D ...

  4. Oracle性能调优之物化视图用法简介

    目录 一.物化视图简介 二.实践:创建物化视图 一.物化视图简介 物化视图分类 物化视图分类,物化视图语法和as后面的sql分为: (1) 基于主键的物化视图(主键物化视图) (2)基于Rowid的物 ...

  5. C#:ref关键字和out关键字的区别

    1.在不使用关键字(比如ref关键字.out关键字等)修饰函数的情况下,大部分函数的参数是以值传递的方式,也就是说,“调用函数”在使用参数(比如myNumber)时,是把该参数复制多一份,然后将其传递 ...

  6. mysql性能的检查和优化方法

    这个命令可以看到当前正在执行的sql语句,它会告知执行的sql.数据库名.执行的状态.来自的客户端ip.所使用的帐号.运行时间等信息 mysql在遇到严重性能问题时,一般都有这么几种可能:1.索引没有 ...

  7. PHP服务端优化全面总结

    一.优化PHP原则 1.1PHP代码的优化 (1)升级最新的PHP版本 鸟哥PPT里的对比数据,就是WordPress在PHP5.6执行100次会产生70亿次的CPU指令执行数目,而在PHP7中只需要 ...

  8. windows环境中hbase源码编译遇到的问题

    转载请注明出处 问题一 [ERROR] Failed to execute goal org.codehaus.mojo:findbugs-maven-plugin:3.0.0:findbugs (d ...

  9. everything 13问

    [1]everything 由来? everything 是澳大利亚人David Carpenter开发的一个运行于windows系统,基于文件.文件夹名称的快速免费搜索引擎. 自从问世以来,因其占用 ...

  10. j2ee的容器:web容器和ejb容器的概念

    在J2EE中,容器充当的是中间件的角色. 两种主要容器的概念 Web容器 给处于其中的应用程序组件(JSP.Servlet)提供一个环境,使得JSP,Servlet能直接和容器中的环境变量.接口交互而 ...