【Python全栈笔记】05 [模块二] 19 Oct 文件的操作


文件操作

一般步骤1. 文件打开 2. 文件操作 3. 文件关闭

1. 打开文件

使用open(文件名(绝对路径), 打开模式, 编码)

文件打开的模式有:

r: 只读模式(默认)

w: 只写模式 (不可读,文件不存在就创建,存在则清空)

x: 只写模式 (不可读,文件不存在就创建,存在则报错)

a: 追加模式 (不可读,如果文件不存在就创建,如果存在则在原文件后面追加)

以上都是以字符串方式打开

'+' 表示可以同时读写某个文件

'b' 表示以字节的方式操作 -> 后续socket部分会用到

文件的打开方式有 普通打开方式 和 二进制打开方式

普通打开:python内部将0101自动转换成字符串

二进制打开:'b'模式加str - bytes 转换 + 手动encoding='utf-8'

 1 # 打开一个文件使用open(文件名(绝对路径),打开模式,编码)
 2 # 文件打开默认只读模式('r')
 3 #
 4 f = open('test.log', 'r')
 5 data = f.read()
 6 f.close()
 7 print(data)
 8 
 9 f = open('test.log', 'r')
10 data = f.write('ehhh')
11 f.close()
12 print(data)
13 # 在只读状态下写入,报错 Traceback (most recent call last):
14 # File "D:/NaomiPyer/naomi_01/mod8/file_stuff.py", line 21, in <module>
15 #  data = f.write('ehhh')
16 # io.UnsupportedOperation: not writable
17 
18 # 只写 - 文件不可读,只写情况下,文件不存在则创建,存在则清空内容写入
19 f = open('test1.log', 'w')
20 f.write('ruby')
21 f.close()
22 # 执行后自动创建了有'ruby'内容的文件
23 f = open('test1.log', 'w')
24 f.write('python')
25 f.close()
26 # 修改写入内容再次执行,文件内容更新为新输入的内容
27 f = open('test1.log', 'w')
28 f.read()
29 # 报错, 不可读 => io.UnsupportedOperation: not readable
30 
31 # x 只写 - 不可读,不存在则创建,存在则报错
32 f = open('test1.log', 'x')
33 f.write(' ')
34 f.close()
35 # 文件已存在,报错 => FileExistsError: [Errno 17] File exists: 'test1.log'
36 
37 # a 追加 - 不可读,不存在则创建,存在则只追加内容
38 f = open('test.log', 'a')
39 f.write('java')
40 f.close()
41 # 'test.log'文件里面追加了java 内容
42 
43 # 以上为文件的基本打开方式
44 # 通常读取到的文件数据,类型是str, 如果要转换为字节,可以用types()
45 f = open('test.log', 'r')
46 data = f.read()
47 a = bytes(data, encoding='utf-8')
48 print(a)
49 # 这样文件里的数据就以bytes输出了 => b'zen of pythonjava'
50 
51 # 以字节方式打开
52 # 1. 只读
53 f = open('test.log', 'rb')
54 data = f.read()
55 print(data)
56 str_data = str(data, encoding='utf-8')
57 print(str_data)
58 # 不需要编码
59 
60 # 2. 只写
61 f = open('test.log', 'wb')
62 f.write(bytes('牛奶', encoding='utf-8'))
63 f.close()
64 # 写入的字符串"牛奶"需要用编码变为bytes写入
65 f = open('test1.log', 'wb')
66 str_data = '牛奶'
67 bytes_data = bytes(str_data, encoding='utf-8')
68 f.write(bytes_data)
69 f.close()
70 # 以字节的方式写入

'+'

r+ 读写

 1 # r+
 2 # w, 末尾追加,指针最后
 3 f = open('test1.log', 'r+', encoding='utf-8')
 4 
 5 # 指针为0, 起始位置
 6 print(f.tell())
 7 
 8 data = f.read(3)  # read(3) 读取3个字符(中文9个字节)
 9 print(type(data), data)
10 print(f.tell())
11 # f.write('草莓')
12 # f.seek(0)
13 # data = f.read()
14 f.read(2)
15 print(f.tell())
16 print(type(data), data)
17 f.close()
18 # 指针 读取完数据,继续读取的时候从上次停下的位置开始继续读取
19 # 通过tell() 来获取指针
20 # 通过seek() 来调整指针 [seek以字节来说]
21 # 写入的时候,指针会调到最后

w+ 写读

 1 # w+,先清空,写完内容之后才可以读
 2 # 写入完毕,指针到最后 
 3 f = open('test1.log', 'w+', encoding='utf-8')
 4 data = f.read()
 5 f.close()
 6 print(data)
 7 # 没有数据,因为写读是先写入再读取,没有写入的内容
 8 f = open('test1.log', 'w+', encoding='utf-8')
 9 f.write('鸡蛋')
10 data = f.read()
11 f.close()
12 print(data)
13 # 还是没有内容,因为写完之后指针已经到文件末尾
14 f = open('test1.log', 'w+', encoding='utf-8')
15 f.write('鸡蛋')
16 f.seek(0)
17 data = f.read()
18 f.close()
19 print(data)
20 # 写入数据后,调整指针到起始位置,读到文件内容

x+ 写读

基本和 w+ 一样,不同的是,如果文件已经存在,会报错。

a+ 写读

 1 # a+
 2 # 写时追加,放到最后
 3 f = open('test.log', 'a+', encoding='utf-8')
 4 print(f.tell())
 5 data = f.read()
 6 print(data)
 7 f.seek(0)
 8 data = f.read()
 9 print(data)
10 f.close()
11 # 因为a是追加,其实在打开文件的同时,指针已经到了文件末尾
12 # => 6 空 牛奶

几种读写方式共有的特点

1 # 从开始向后读
2 # 写,追加,指针调到最后   
3 f.tell()  # 获取指针的位置
4 f.seek(num)  # 调整指针的位置
5 data = f.read(1)  # 读取一个字符(中文3个字节)
6 print(data)
7 print(f.tell())  # 向后移了三个字节
8 f.write('content')  # 在尾部追加,并且指针移动到最后
9 f.close()

在不确定每个读写方式特点的时候,可以通过tell(), seek(), read(), write() 方法来判断

'b' 表示以字节的方式操作

wb w+b

rb r+b

xb x+b

ab a+b

上述是和在底层数据交流的时候,以字节的方式读写,默认以字节方式打开,拿到字节数据后转化为字符串进行操作,写入的时候同样转换为字节写入。

文件的操作:

 1 # close() 关闭一个文件
 2 
 3 # fileno() 文件描述符(后续讲)
 4 
 5 # flush() 文件内部缓冲区
 6 # 写入内容之后,f.flush()可以将内存里写入的东西刷入到硬盘里
 7 
 8 # read(1) 读取内容
 9 
10 # readable() 判断是否可读
11 
12 # readline(1) 仅读取一行内容,再次执行会从第一次指针停下来的位置继续往下读取
13 
14 # seek() 调整指针
15 
16 # truncate() 截取, 依赖于指针
17 
18 f = open("test.log", 'r', encoding='utf-8')
19 # f.read()
20 for line in f:
21     print(line)
22 # 效果同readline(),且比readline()更好用
23 
24 # 关闭文件 close()
25 # 每次文件读写都要close(),比较麻烦,可以通过with语句来自动关闭
26 with open('test.log', 'r') as f:
27     f.read()
28 # 读取数据时,上面代码自动帮助close()文件
29 # python 2.7 及以后版本,可以同时还打开两个文件
30 with open('log1', 'r') as obj1, open('log2', 'r') as obj2:
31     pass
32 # 以读方式打开源文件,同时打开新文件w,可以一行一行读取然后一行一行写入新文件。大大节省了内存。
33 with open('源文件', 'r') as obj1, open('新文件', 'w') as obj2:
34     for line in obj1:
35         obj2.write(line)

文件关闭后不会保存指针,但是关闭前,文件读到哪儿,指针就指到哪儿。

如果需要记录文件读取的位置,我们可以将tell()指针位置先保存起来,下一次打开的时候seek()一下重新读取

优质内容筛选与推荐>>
1、cogs896 圈奶牛
2、元素的定位
3、python 爬虫--下载图片,下载音乐
4、6. python 字符串格式化表达式
5、CakePHP中配置AppModel避免中文乱码


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn