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("文件打开失败")
file_open.py

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)
练习.py

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("文件打开失败")
file_read_text.py

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("创建文件失败")
file_write_text.py

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)  # 写入到文件中
write_text_to_file.py

   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())
read_text_from_file.py

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)
stdin1.py
1 # 此示例示意标准输入文件 sys.stdin 的用法
2 import sys
3 s = sys.stdin.read()
4 
5 print(s)
stdin2.py
1 #8.快捷键是让键盘输入文件结束符
2 s = sys.stdin.read()
3 ctrl + d  #快捷键是让键盘输入文件结束符
stdin3.py(快捷键是让键盘输入文件结束符)
 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()
stdout.py

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("打开二进制文件失败")
file_read_binary.py
 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("打开写文件失败")
file_write_binary.py

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()
tell.py

   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()
seek.py
 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()
flush的用法.py
 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()
flush原理.py

二、汉字编码(只讲两种)

   问题:
     十个汉字占多少个字节?
       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) 
gbk_vs_utf-8.py

三、编码注释:

   在源文件中第一行或第二行写入如下内容为编码注释

  # -*- coding:gbk -*-
   # 设置源文件编码格式为:gbk
   或
   # -*- coding:utf-8 -*-
   # 设置源文件编码格式为:utf-8

作用:
   告诉解释执行器,当前的.py文件的编码格式是什么

1 # -*- coding:gbk -*-
2 
3 print("你好中国")
编码注释的用法.py

 

四、PEP8编码规范

代码编排

  1. 使用4空格缩进,不使用Tab,更不允许用Tab和空格混合缩进
  2. 每行最大长度最大79字节,超过部分使用反斜杠折行
  3. 类和全局函数定义间隔两个空行,类内方法定义间隔一个空行.其它地方可以不加空行。

文档编排

  1. 其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
  2. 不要在一句import中导入多个模块,比如不推荐import os, sys。
  3. 尽可能用import XX 而不采用from XX import YY引用库,因为可能出现名字冲突。

空格的使用

  1. 各种右括号前不用加空格
  2. 逗号、冒号、分号前不要加空格。
  3. 函数的左括号前不要加空格。如func(1)。
  4. 序列的左括号前不要加空格。如list[2]。
  5. 操作符左右各加一个空格,不要为了对齐增加空格。
  6. 函数默认参数使用的赋值符左右省略空格。
  7. 不要将多条语句写在同一行,尽管使用‘;’允许。
  8. 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("文件打开失败")
练习1.py

  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)
练习2.py

 

posted on 2018-10-12 17:37  破天荒的谎言、谈敷衍  阅读(495)  评论(0)    收藏  举报

导航