Python文件IO(普通文件读写)
## 打开一个文件
- fileobj = open(filename, mode)
其中:
fileobj是open()返回的文件对象
filename是该文件的字符串名
mode是指明文件类型和操作的子字符串
- mode的第一个字母表示对其的操作
- r表示读取
- w表示写入,如果文件不存在就创建,如果存在则重新写入新内容
- x表示在文件不存在的情况下新创建并写文件
- a表示如果文件存在,在文件末尾追加内容
- mode的第二个字母是文件类型
- t(或者省略)代表文本类型
- b代表二进制文件
## 使用write()写入文件,使用close()关闭文件
1 poem = """ 2 离离原上草,一岁一枯荣。 3 野火烧不尽,春风吹又生。 4 远芳侵古道,晴翠接荒城。 5 又送王孙去,萋萋满别情。 6 """ 7 file_obj = open("诗", 'wt') # 打开名为‘诗’的文本文件,若‘诗’不存在则创建 8 file_obj.write(poem) # 写入文件 9 file_obj.close() # 关闭文件
- 也可以使用print()写入文件
1 poem = """ 2 离离原上草,一岁一枯荣。 3 野火烧不尽,春风吹又生。 4 远芳侵古道,晴翠接荒城。 5 又送王孙去,萋萋满别情。 6 """ 7 file_obj = open("诗", 'wt') # 打开名为‘诗’的文本文件,若‘诗’不存在则创建 8 print(poem, file=file_obj) # 写入文件 9 file_obj.close() # 关闭文件
- 如果需要写入的内容非常多,可以将数据分块写入
1 poem = """ 2 离离原上草,一岁一枯荣。 3 野火烧不尽,春风吹又生。 4 远芳侵古道,晴翠接荒城。 5 又送王孙去,萋萋满别情。 6 """ 7 file_obj = open("诗", 'wt') # 打开名为‘诗’的文本文件,若‘诗’不存在则创建 8 9 start = 0 10 chunk = 20 # 每次写入20个字符 11 while True: 12 if start > len(poem): 13 break 14 file_obj.write(poem[start:start+chunk]) 15 start += chunk 16 17 file_obj.close() # 关闭文件
## 文件读取
- read():不带参数的read()函数一次读取文件的所有内容
1 file_obj = open("诗", 'rt') # 使用读取模式打开文本文件 2 poem = file_obj.read() # 读取文件中所有内容 3 file_obj.close() # 关闭文件 4 print(poem) 5 """ 6 输出: 7 离离原上草,一岁一枯荣。 8 野火烧不尽,春风吹又生。 9 远芳侵古道,晴翠接荒城。 10 又送王孙去,萋萋满别情。 11 """
- 同样可以分块读取
1 poem = '' 2 file_onj = open("诗", 'rt') 3 chunk = 20 # 每次读取20个字符 4 while True: 5 frag = file_onj.read(chunk) 6 if not frag: # 读到文件末尾时再次调用read()函数会返回空字符串,not frag为真,执行break 7 break 8 poem += frag 9 10 print(poem) 11 """ 12 输出: 13 离离原上草,一岁一枯荣。 14 野火烧不尽,春风吹又生。 15 远芳侵古道,晴翠接荒城。 16 又送王孙去,萋萋满别情。 17 """
- 一行一行的读取
1 poem = '' 2 file_obj = open('诗', 'rt') 3 while True: 4 line = file_obj.readline() 5 if not line: 6 break 7 poem += line 8 9 print(poem) 10 """ 11 输出: 12 离离原上草,一岁一枯荣。 13 野火烧不尽,春风吹又生。 14 远芳侵古道,晴翠接荒城。 15 又送王孙去,萋萋满别情。 16 """
- 使用迭代器读取文件
1 poem = '' 2 file_obj = open("诗", 'rt') 3 for line in file_obj: # 效果相同,但代码更短 4 poem += line 5 6 print(poem) 7 """ 8 输出: 9 离离原上草,一岁一枯荣。 10 野火烧不尽,春风吹又生。 11 远芳侵古道,晴翠接荒城。 12 又送王孙去,萋萋满别情。 13 """
- readlines():每次读取一行,并返回单行字符串的列表
1 file_obj = open("诗", 'rt') 2 lines = file_obj.readlines() 3 print(lines) 4 for line in lines: 5 print(line, end='') 6 7 """ 8 ['\n', ' 离离原上草,一岁一枯荣。\n', ' 野火烧不尽,春风吹又生。\n', ' 远芳侵古道,晴翠接荒城。\n', ' 又送王孙去,萋萋满别情。\n'] 9 10 离离原上草,一岁一枯荣。 11 野火烧不尽,春风吹又生。 12 远芳侵古道,晴翠接荒城。 13 又送王孙去,萋萋满别情。 14 """
## write()写入二进制文件
1 bin_data = bytes(range(0, 255)) # 将序列转换为二进制数据 2 f = open('bin_file', 'wb') # 以二进制文件的格式打开文件 3 f.write(bin_data) # 写入 4 f.close() # 关闭
- 分段写入
1 bin_data = bytes(range(0, 255)) 2 f = open('bin_file', 'wb') 3 chunk = 100 # 每次写入100个字节 4 offset = 0 5 while True: 6 if offset > len(bin_date): 7 break 8 f.write(bin_data[offset:chunk + offset]) 9 offset += chunk 10 11 f.close()
- 读取二进制文件
1 f = open('bin_file', 'rb') 2 bin_data = f.read() 3 f.close()
## 使用with自动关闭文件,with代码块执行完毕后自动关闭文件
1 with open("诗", 'rt') as f: 2 poem = f.read() 3 4 print(poem) 5 """ 6 输出: 7 离离原上草,一岁一枯荣。 8 野火烧不尽,春风吹又生。 9 远芳侵古道,晴翠接荒城。 10 又送王孙去,萋萋满别情。 11 """
本文参考:
[美]Bill Lubanovic 《Python语言及其应用》
上一篇: 15分钟从零开始搭建支持10w+用户的生产环境(四)
下一篇: 使用CSS完成商城首页的优化