码迷,mamicode.com
首页 > 编程语言 > 详细

python基础之九:文件操作

时间:2019-11-22 23:29:25      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:读一行   set   size   输入   lin   names   div   操作   路径   

1、绝对路径与相对路径

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

2、文件读取

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

 

3、文件写入

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

 

4、文件追加

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

 

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基础之九:文件操作

标签:读一行   set   size   输入   lin   names   div   操作   路径   

原文地址:https://www.cnblogs.com/funyou/p/11914779.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!