python基础(16)——文件 & 汉字编码 & PEP8编码规范
一、文件 File
什么是文件
文件是用于数据存储的单位
文件通常用来长期存储数据
文件中的数据是以字节(byte)为单位进行存储的
1、文件的操作流程:
1. 打开文件
2. 读/写文件
F.read([n字节或字符])/F.readline()/F.readlines()
F.write(字节串或字符串)/F.writelines(字节或字符序列)
3. 关闭文件
注:任何操作系统,一个应用程序同时打开文件的数量有最大数限制
文件的打开函数:
open(file, mode='rt') 用于打开一个文件,返回此文件对应的文件流对象,如果打开失败则会触发OSError错误
文件的关闭方法:
F.close() # 关闭文件,释放系统资源
1 # 此示例示意文件 的打开和关闭 2 try: 3 # f = open("mynote.txt") # 打开文件 4 f = open('/home/tarena/aid1807/pbase/day16/code/mynote.txt') 5 print("文件打开成功") 6 # 读写文件 7 8 # 关闭文件 9 f.close() 10 print("文件已关闭") 11 except OSError: 12 print("文件打开失败")
2、文本文件的操作:
文本文件的模式字符 't'
1、说明:
1. 对文本文件的读写需要用字符串str 进行读取和写入数据
2. 默认文件中存储的都是字符(文字)数据,在读写中会自动进行编码转换操作
3. 以行为单位分隔,在python内统一用'\n'作用换行符进行分隔
2、各操作系统的换行符:
Linux换行符: '\n'
Windows 换行符: '\r\n'
旧的Macintosh换行符: '\r'
新的Mac OS 换行符: '\n'
3、文件流对象常用的方法见:
mode 模式字符的含义
| 字符 | 含义 |
|---|---|
| 'r' | 以只读方式打开(默认) |
| 'w' | 以只写方式打开,删除原有文件内容(如果文件不存在,则创建该文件并以只写方式打开) |
| 'x' | 创建一个新文件, 并以写模式打开这个文件,如果文件存在则会产生"FileExistsError"错误 |
| 'a' | 以只写文件打开一个文件,如果有原文件则追加到文件末尾 |
| 'b' | 用二进制模式打开 |
| 't' | 文本文件模式打开 (默认) |
| '+' | 为更新内容打开一个磁盘文件 (可读可写) |
- 缺省模式是 'rt'
- 'w+b' 可以实现二进制随机读写,当打开文件时,文件内容将被清零
- 'r+b' 以二进制读和更新模式打开文件,打开文件时不会清空文件内容
- 'r+' 以文本模式读和更新模式打开文件,打开文件时不会清空文件内容
python 文件常用方法:
| 方法 | 说明 |
|---|---|
| F.close() | 关闭文件(关闭后文件不能再读写会发生ValueError错误) |
| F.readline() | 读取一行数据, 如果到达文件尾则返回空行 |
| F.readlines(max_chars=-1) | 返回每行字符串的列表,max_chars为最大字符(或字节)数 |
| F.writelines(lines) | 将字符串的列表或字符串的列表中的内容写入文件 |
| 二进制文件操作方法 | |
| F.read(size=-1) | 从一个文件流中最多读取size个字符(文本文件)或字节(二进制文件),如果不给出参数,则默认读取文件中全部的内容并返回 |
| F.write(text) | 写一个字符串到文件流中,返回写入的字符数(文本文件)或字节数(二进制文件) |
| F.tell() | 返回当前文件流读写指针的绝对位置(字节为单位) |
| F.seek(offset, whence=0) | 改变数据流读写指针的位置,返回新的绝对位置 |
| F.flush() | 把写入文件对象的缓存内容写入到磁盘 |
| F.readable() | 判断这个文件是否可读,可读返回True,否则返回False |
| F.writable() | 判断这个文件是否可写,可写返回True,否则返回False |
| F.seekable() | 返回这个文件对象是否支持随机定位 |
| F.truncate(pos = None) | 剪掉 自pos位置之后的数据,返回新的文件长度 |
练习:
自己写一个文件 'info.txt' 内部存一些文字信息如下:
张三 20 100
李四 21 96
小王 20 98
注:
以上信息用空格作用分隔符分开
写程序将这些数据读取出来,并以如下格式打印出来:
张小 今年 20 岁,成绩是: 100
李四 今年 21 岁,成绩是: 96
小王 今年 20 岁,成绩是: 98
1 def read_info_txt(): 2 rl = [] 3 try: 4 f = open("info.txt") 5 L = f.readlines() # ['张三 20 100\n', '李四 21 96\n', '小王 20 98\n'] 6 for line in L: 7 s = line.strip() # 去掉左右两侧的空白字符 8 name, age, score = s.split() # ['张三','20','100'] 9 age = int(age) # 转为整数 10 score = int(score) 11 rl.append({'name': name, 12 'age': age, 13 'score': score}) 14 f.close() 15 return rl # 返回列表 16 except OSError: 17 print("读取文件失败!") 18 19 20 def print_info(L): 21 for d in L: 22 print(d['name'], '今年', 23 d['age'], '岁,成绩是:', 24 d['score']) 25 26 L = read_info_txt() 27 print_info(L)
4、文本文件的读方法:
F.readline()
F.readlines()
F.read([字符数或字节数])
1 # 此示例示意文件 的打开及读取文本信息的操作 2 try: 3 f = open("mynote.txt") # 打开文件 4 print("文件打开成功") 5 # 读写文件 6 s = f.readline() # 读取一行 s='abcd\n' 7 print('len(s)=', len(s), '内空是', s) 8 s = f.readline() # 再读取一行 s = '1234' 9 print('len(s)=', len(s), '内空是', s) 10 s = f.readline() # 再读取第三行 s = '' 11 print('len(s)=', len(s), '内空是', s) 12 # 关闭文件 13 f.close() 14 print("文件已关闭") 15 except OSError: 16 print("文件打开失败")
5、文本文件的写方法
模式字符串: 'w'/'x'/'a'
F.write(字符串)
F.writelines(字符串列表)
1 # f = open("newfile") 2 # 如果不写第二个参数默认是: f = open('newfile', 'rt') 3 try: 4 # f = open("/root/newfile.txt", 'wt') # 失败抛出异常错误通知 5 f = open("newfile.txt", 'w') 6 # f = open("newfile.txt", 'x') # 如果原文件存在,则报错 7 # f = open("newfile.txt", 'a') # 如果原文件存在,则报错 8 print("打开成功") 9 # 在此处进行写文件操作 10 f.write("hello") 11 f.write("world") 12 f.writelines(['123456\n', 'abcdef\n']) 13 14 f.close() 15 print("关闭文件成功") 16 except OSError: 17 print("创建文件失败")
6、文件的迭代读取
文件流对象是可迭代对象,迭代过程将以换行符'\n'作用分隔符依次获取
示例:
f = open('mynote.txt', 'rt')
for line in f: # f绑定的文件流对象是可迭代对象
print(line)
练习:
1. 写程序,读入任意行文字,当输入空行时结束输入
先将这些读入的文字存入列表中, 然后再将列表里的内容存入到'input.txt'文件中
1 def input_to_list(): 2 L = [] 3 while True: 4 s = input("请输入: ") 5 if not s: 6 break 7 L.append(s) 8 return L 9 10 11 def list_to_file(lst, filename='input.txt'): 12 '''将字符串的列表,保存在filename 文件中''' 13 try: 14 fw = open(filename, 'w') 15 for s in lst: 16 # 把s绑定的字符串写入到input.txt文件中 17 fw.write(s) 18 fw.write('\n') # 写入换行符,用来区分行 19 fw.close() 20 except OSError: 21 print("写入文件失败") 22 23 L = input_to_list() # 读入数据 24 list_to_file(L) # 写入到文件中
2. 写程序,从上题的input.txt中读取之前输入的数据,读取到列表中,再加上行号进行输出
1 def read_from_file(filename='input.txt'): 2 L = [] 3 try: 4 fr = open(filename, 'rt') 5 for line in fr: 6 s = line.rstrip() # 去掉最右侧的空白字符 7 L.append(s) 8 fr.close() 9 print("读取文件成功") 10 except OSError: 11 print("打开读文件失败!!!") 12 return L 13 14 def print_text(lst): 15 for line_number, s in enumerate(lst, 1): 16 print(line_number, ":", s) 17 18 if __name__ == '__main__': 19 print_text(read_from_file())
7、标准输入输出文件:
sys.stdin 标准输入文件(默认为键盘设备)
ctrl + d 快捷键是让键盘输入文件结束符
sys.stdout 标准输出文件 (默认为屏幕终端)
sys.stderr 标准错误输出文件(默认为屏幕终端)
模块名: sys
说明:
1. 标准文件不需要打开和关闭就可以使用
2. 每一个python程序启动后都会有以上三个文件供我们使用
1 # 此示例示意标准输入文件 sys.stdin 的用法 2 import sys 3 s = sys.stdin.readline() 4 print(s) 5 6 sys.stdin.close() # 关闭标准输入文件,则input函数就不能用了 7 s2 = input("请输入:") 8 print(s2)
1 # 此示例示意标准输入文件 sys.stdin 的用法 2 import sys 3 s = sys.stdin.read() 4 5 print(s)
1 #8.快捷键是让键盘输入文件结束符 2 s = sys.stdin.read() 3 ctrl + d #快捷键是让键盘输入文件结束符
1 import sys 2 sys.stdout.write("我是一个标准输出\n") 3 4 sys.stderr.write("我的出现是个错误!!!\n") 5 6 print("hello", 'world', file=sys.stdout) 7 8 f =open("myfile.txt", 'w') 9 print("你好!", "我在文件里", file=f) 10 f.close()
3、二进制文件操作:
模式字符: 'b'
默认文件中存储的都是以字节为单位的数据,通常有人为的格式
对二进制文件的读写需要用字节串(bytes) 进行操作
1 # 二进制方式读取文件内容 2 try: 3 fr = open('mynote.txt', 'rb') # 二进制读方式打开 4 b = fr.read() # b = b'abcd\n1234' 返回字节串 5 print(b) 6 7 fr.close() 8 except OSError: 9 print("打开二进制文件失败")
1 # 二进制文件的写操作 2 try: 3 fbw = open("mybinary.bin", 'wb') # '二进制写操作' 4 s = '你好' 5 b = s.encode('utf-8') # 转为字节串 6 fbw.write(b) 7 ba = bytearray(range(256)) 8 fbw.write(ba) 9 fbw.close() 10 print("文件写入成功") 11 except OSError: 12 print("打开写文件失败")
4、常用的操作方法:
1、F.read([字节数/字符数])
对于文本文件, F.read()返回类型为字符串str
对于二进制文件,F.read()返回类型为字节串bytes
2、 F.write()
同上,对于二进制文件,写入的数据为字节串bytes或bytearray
3、F.tell() 方法
返回当前文件流的读写位置(从0开始,以字节为单位)
1 # tell方法的用法 2 f = open('20.txt', 'rb') # 二进制方式打开 3 b = f.read(3) # 读了三个字节 4 print(b) 5 # 请问当前读写位置在哪儿呢? 6 pos = f.tell() # 返回读写位置 7 print("当前的读写位置是: ", pos) # 3 8 b2 = f.read(1) 9 print("再读一个字节后的读写位置是:", f.tell()) # 4 10 11 f.close()
4、F.seek方法
作用:
设置文件的读写位置
格式:
F.seek(偏移量, whence=相对位置)
偏移量
大于0代表向文件尾方向移动
小于0代表向文件头方向移动
相对位置
0 代表从文件头开始偏移
1 代表从当前位置开始偏移
2 代表从文件尾开始偏移
1 # seek方法的用法 2 f = open('20.txt', 'rb') # 二进制方式打开 3 b = f.read(3) # 读了三个字节 4 print(b) 5 # f.seek(5, 0) # 代表从文件头向后移动5个字节 6 # f.seek(2, 1) # 代表从当前位置向后移动2个字节 7 f.seek(-15, 2) # 代表从文件尾向前移动15个字节 8 9 b = f.read(5) 10 print(b) # b'ABCDE' 11 12 f.close()
1 # flush的用法 2 import time 3 f = open('myflush.txt', 'w') 4 5 f.write('aaaaaaaa') 6 f.flush() # 强制将缓冲区的内容写到磁盘上 7 8 s = input("请输入回车键继续: ") 9 10 f.close()
1 # flush原理 2 import time 3 f = open('myflush.txt', 'w') 4 while True: 5 f.write('aaaaaaaa' * 100) 6 time.sleep(1) 7 print("写入一次...") 8 9 s = input("请输入回车键继续: ") 10 11 f.close()
二、汉字编码(只讲两种)
问题:
十个汉字占多少个字节?
20个(GBK编码)
30个(UTF-8编码)
1、国标编码
GB18030 (二字节或四字节编码, 27533个字)
GBK (二字节编码 21003个字)
GB2312 (二字节编码 6763个字)
(Windows上常用)
2、国际标准:
UNICODE <---> UTF-8
(Linux / Mac OS X / IOS / Android常用)
UTF-8 (8-bit Unicode Transformation Format)
3、python的编码(encode)字符串:
'gb2312'
'gbk'
'gb18030'
'utf-8'
'ascii'
1 # 汉字编码转换 2 f = open('linux_10hz.txt', 'rb') 3 b = f.read() # 读到30字节 4 s = b.decode() 5 print('linux下写的十个字是:', s) 6 f.close() 7 8 f2 = open('windows_10hz.txt', 'rb') 9 b = f2.read() 10 f2.close() 11 s = b.decode('gbk') 12 print("Windows下写的十个汉字是:", s)
三、编码注释:
在源文件中第一行或第二行写入如下内容为编码注释
# -*- coding:gbk -*-
# 设置源文件编码格式为:gbk
或
# -*- coding:utf-8 -*-
# 设置源文件编码格式为:utf-8
作用:
告诉解释执行器,当前的.py文件的编码格式是什么
1 # -*- coding:gbk -*- 2 3 print("你好中国")
四、PEP8编码规范
代码编排
- 使用4空格缩进,不使用Tab,更不允许用Tab和空格混合缩进
- 每行最大长度最大79字节,超过部分使用反斜杠折行
- 类和全局函数定义间隔两个空行,类内方法定义间隔一个空行.其它地方可以不加空行。
文档编排
- 其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
- 不要在一句import中导入多个模块,比如不推荐import os, sys。
- 尽可能用import XX 而不采用from XX import YY引用库,因为可能出现名字冲突。
空格的使用
- 各种右括号前不用加空格
- 逗号、冒号、分号前不要加空格。
- 函数的左括号前不要加空格。如func(1)。
- 序列的左括号前不要加空格。如list[2]。
- 操作符左右各加一个空格,不要为了对齐增加空格。
- 函数默认参数使用的赋值符左右省略空格。
- 不要将多条语句写在同一行,尽管使用‘;’允许。
- if/for/while语句中,即使执行语句只有一句,也必须另起一行
原则:避免不必要的空格
练习:
1. 写程序,让用户输入一系列整数,当输入小于零的数时结束输入
1) 将这些数字存于列表中
2) 将列表中的数字写入到文件numbers.txt中
(提示:需要将整数转为字符串或字节串才能存入文件中)
1 L = [] 2 while True: 3 n = int(input("请输入大于0的整数: ")) 4 if n < 0: 5 break 6 L.append(n) 7 8 print(L) 9 try: 10 f = open('numbers.txt', 'w') # 文本文件方式打开 11 for n in L: 12 f.write(str(n)) # 出错 13 f.write('\n') 14 f.close() 15 except OSError: 16 print("文件打开失败")
2. 写程序,实现复制文件功能
要求:
1) 要考虑关闭文件问题
2) 要考虑超大文件复制问题
3) 要能复制二进制文件(如:/usr/bin/python3 等文件)
1 def mycopy(src_filename, dst_filename): # 源文件名和目标文件名 2 try: 3 fr = open(src_filename, 'rb') 4 try: 5 try: 6 fw = open(dst_filename, 'wb') 7 try: 8 while True: 9 b = fr.read(4096) 10 if not b: 11 break 12 fw.write(b) 13 finally: 14 fw.close() 15 except OSError: 16 print("打开目标文件失败") 17 finally: 18 fr.close() 19 except OSError: 20 print("打开源文件失败") 21 22 23 src = input("请输入源文件名:") 24 dst = input("请输入目标文件名:") 25 mycopy(src, dst)
posted on 2018-10-12 17:37 破天荒的谎言、谈敷衍 阅读(495) 评论(0) 收藏 举报
浙公网安备 33010602011771号