python基础day16笔记

2018.7.23

day15回顾

迭代器

得到迭代器

  iter(x),返回一个访问x的迭代器

从迭代器it中拿数据

  next(it)

两种生成器:

生成器函数:

  生成器函数里一定有 yiled 语句

  next(it)每次调用,生成器函数才会执行

生成器表达式:

  (表达式 for 变量 in 可迭代对象 if 真值表达式)

迭代工具函数

  zip(可迭代对象1,可迭代对象2,...)

  enumerate(可迭代对象,strat=0)

序列:

字节串bytes,字节数组bytearray

day16

问题:

  如何长期保存计算机中的数据

  需要用文件操作

文件File

  文件是用于数据存储和单位

  文件通常用来长期存储数据

  文件中的数据是以字节为单位进行顺序存储的

文件的操作流程:

  1,打开文件

  2,读/写文件

  3,关闭文件

注:

  任何的操作系统,一个应用程序同时打开文件的数量有最大数限制

文件的打开函数

  open(file,mode='rt') 用于打开一个文件,返回此文件流对象,

  如果打开文件失败,则会触发OSError错误

文件的关闭方法

  F.close()  #关闭文件,释放系统资源

示例:

# 此示例示意文件的打开和关闭操作
try:
    f = open('./aaa.txt')  # 不存在此文件
    # f = open('./myfile.txt')  # 不存在此文件
    print("打开文件成功")

    # 此处要进行读/写操作

    f.close()  # 关闭文件
except OSError:
    print("文件打开失败")

示例2:

#myfile.txt
#ABCD中
#hello
#world
#上面是txt文档

# 此示例示意文件的打开和 '读' 操作
try:
    f = open('./myfile.txt')  
    print("打开文件成功")

    # 此处要进行读操作
    s = f.read()  # 读取全部的内容,形成字符串用s绑定
    print("读取到", len(s), '个字符')
    print("内容是: ", s)

    f.close()  # 半闭文件
except OSError:
    print("文件打开失败")

示例3:

# file_read_binary.py


f = open('py.tar.gz', 'rb')  # 'b' 二进制模式

b = f.read(4)
print('b的类型是:', type(b))

print("b的内容是:", b)

f.close()

示例4:

#myfile.txt
#ABCD中
#hello
#world
#上面是txt文档,输入电脑去掉#

## 此示例示意文件的打开和 '读' 操作
try:
    f = open('./myfile.txt')  
    print("打开文件成功")

    # 此处要进行读操作
    s = f.readline()  # 读取一行数据,当读取的'\n'就返回
    print("len(s)=", len(s))
    print('s:', s)
    s = f.readline()  # 读取第二行
    print("第二行:", s)
    s = f.readline()  # 读取第三行
    print("第三行:", s)
    s = f.readline()  # 只能读取空字符串(表示已经到达文件尾)
    if s == '':
        print("--------已到达文件尾---------")
    f.close()  # 半闭文件
except OSError:
    print("文件打开失败")

示例5:

#myfile.txt
#ABCD中
#hello
#world
#上面是txt文档,输入电脑去掉#

# 此示例示意文件的打开和用 readlines '读' 操作
try:
    f = open('./myfile.txt')  
    print("打开文件成功")

    # 此处要进行读操作
    L = f.readlines()
    print("L=", L)

    f.close()  # 半闭文件
except OSError:
    print("文件打开失败")

示例6:

#mynote.txt
#中文中文中文中文
#上面是txt文档

# 此示例示意文本文件的写操作

try:
    f = open('mynote.txt', 'w')  # 'w'代表只写模式
    print("文件打开成功")

    # f.write('hello')
    # f.write('world')
    # f.write("你好")
    f.write("中文")

    f.close()
except OSError:
    print("打开文件失败!")

示例7:

# 此示例示意以二进制文件操作方式进行写文件

f = open('mybinary.bin', 'wb')

b = bytes(range(0, 256))
print("字节串的内容是:", b)

f.write(b)  # 写入256个字节

f.close()  # 关闭文件

示例8:

#mynote2.txt
#你好tarenaabc
#上面是txt文档

# 此示例示意文本文件的写操作

try:
    f = open('mynote2.txt', 'w')  # 'w'代表只写模式
    print("文件打开成功")
    L = ['你好', 'tarena', 'abc']

    f.writelines(L)

    f.close()
except OSError:
    print("打开文件失败!")

文本文件操作:

操作模式:

说明:

  •   默认文件中存储的都为字符数据,在读写过程中会自动进行编解码操作
  •   文本文件以行为单位进行分隔,在python内部统一用'\n' 作用为转行符进行分隔
  •   对文本文件的读写操作需要用字符串(str)进行数据操作

各操作系统的换行符

环境换行符
Linux‘\n’
Windows‘\r\n’
旧的Macintosh‘\r’  (已经不用了)
新的Mac OS‘\n’

 

查看python 文件常用方法:点击

 

练习:

  1,自己写一个文件'info.txt' 内部存一些文字信息

  如:

  张三 20 100

  李四 21 96

  小王 22 98

  写程序将这些程序兑取出来,打印到终端上

info.txt
张三 20 100
李四 21 96
小王 22 98
#上面是info.txt文档

#方法一
try:
    f = open('info.txt')
    L = f.readlines()
    for line in L:
        s = line.strip()
        n, a, s = s.split()  # 拆成列表
        a = int(a)
        s = int(s)
        print("姓名:", n, '年龄:', a, '成绩:', s)
        # print()
    f.close()
except OSError:
    print("打开文件失败")

#方法二
try:
    f = open('info.txt')
    while True:
        line = f.readline()  # 读取一行
        if line == '':
            break  # 已经到行尾,结束处理

        s = line.strip()
        n, a, s = s.split()  # 拆成列表
        a = int(a)
        s = int(s)
        print("姓名:", n, '年龄:', a, '成绩:', s)
        # print()
    f.close()
except OSError:
    print("打开文件失败")

 

  2,写程序,循环输入很多个人的姓名,电话号码,当输入结束后将这些信息存入到phonenumber.txt中

  (建议先用列表暂存数据,格式自己定义)

def get_numbers():
    L = []
    while True:
        n = input("请输入姓名: ")
        if n == '':
            break
        number = input('请输入电话号码: ')
        L.append((n, number))
    return L


def save_to_file(lst, filename='phonenumber.txt'):
    f = open(filename, 'w')
    for n, number in lst:
        f.write(n)
        f.write(',')
        f.write(number)
        f.write('\n')
    f.close()  # 关闭文件


L = get_numbers()
print(L)
save_to_file(L)

  3,写程序,将phonenumber.txt文件中的数据读取出来,在用以下格式打印出来:

  如:小张 的电话 是 1388888888

         小李 的电话 是 1399999999

#phonenumber.txt

#小张,13488888888
#小李,13999999999
#练习2生成的txt文档

def read_from_file(filename='phonenumber.txt'):
    L = []
    f = open(filename)
    while True:
        s = f.readline()
        # 判断是不是到文件尾
        if s == '':
            break
        s = s.strip()  # 去掉换行
        n, number = s.split(',')  # 切为字符串列表
        L.append((n, number))
    return L


L = read_from_file()
print(L)

for n, number in L:
    print(n, '的电话是', number)



 

文件流对象是可迭代对象,迭代过程中将以换行符'\n' 作为分隔符

示例:

f = open('adsad.txt')
for line in f:
    print(line)  # 打印每一行的数据

 

标准输入输出文件:

  • sys.stdin       标准输入文件

                            ctrl+d,文件结束符

  • sys.stdout     标准输出文件
  • sys.stderr     标准错误输出文件

模块名:sys

注:

  标准文件不需要打开和关闭就可以使用

示例见:

import sys

while True:
    s = sys.stdin.readline()
    if len(s) < 2:
        break
    print("刚才读入", len(s), '个字符')
    print("内容是:", s)

print("程序结束")

示例2:

# stdin.py


import sys

s = sys.stdin.read()
print("s=", s)


print("程序结束")

示例3:

# stdout.py

import sys

sys.stdout.write('hello')
sys.stdout.write(' ')
sys.stdout.write("world!\n")

# sys.stdout.close()  # 标准文件不需要关闭

print('这是第二行用print打印的文字')

示例4:

# stderr.py


import sys

sys.stdout.write("我是标准输出\n")
sys.stderr.write("我是一个错误\n")


# 当用 
#   $ python3 stderr > mystdout.txt  2> err.txt

二进制文件操作:

  二进制文件操作模式字符:'b'

  默认文件中存储的是以字节为单位数据,通常有人为规定的格式

  二进制文件操作需要用字节串进行读写

 

F.read() / F.readline() / F.readlines() 返回类型
   对于文本文件,F.read()等函数返回为字符串(str)
   对于二进制文件,F.read()等函数返回为字节串(bytes)

F.write() 对于二进制文件与需要用字节串进行操作

 

F.tell 方法:

作用:

  返回当前的读写位置(从文件头以字节为单位)

F.seek 方法:

作用:

  设置读写位置

F.seek(偏移量,whence=相对位置)

  偏移量

  • 大于0的数代表向文件末尾方向移动的字节数
  • 小于0的数代表向文件头方向中移动的字节数

  相对位置

  • 0代表从文件头开始偏移
  • 1代表从文件当前读写位置开始偏移
  • 2代表从文件尾开始偏移

示例

f = open('mybinary.bin', 'rb')

f.seek(16, 0)
b = f.read(4)  # 读取从16~20的四个字节的内容
print(b)

f.close()

#mybinary.bin 是个文本,里面是一些字节,

示例2:

#myseek.txt
#ABCDEabcde1234567890
#上面是txt文档


# 此示例示意用seek改变文件的读写位置,用tell来得到读写位置

f = open('myseek.txt', 'rb')
b = f.read(2)  # b'AB' 读取出来
print(b)  # b'AB

# 从头开始向后走5个字节
# f.seek(5, 0)

# 从当前位置向后走3个字节
# f.seek(3, 1)

# 从文件尾向前数15个字节
f.seek(-15, 2)

b = f.read(5)
print(b)  # b'abcde'

f.close()

汉字编码(只讲两种)

国标系列:

  GB18030 (二字节或四字节编码,共27533个字)

  GBK (二字节编码,共21003个字)

  GB2312(二字节编码,共6763个汉字)

(windows常用)

国际标准:UNICODE  <---> UTF-8

  (Linux / Mac OS X / IOS / Android 等常用)

问题:

 十个汉字占几个字节

  UTF-8: 30个字节

 

python编码字节串:

  • 'gb2312'
  • 'gbk'
  • 'gb18030'
  • 'utf-8'
  • 'ascii'   转化英文用的
  • ...

以上字符串用于encode和decode中

 

编码注释:

  在python源文件中的第一行或第二行写入如下内容:

  #-*- coding:gbk -*-

  #设置源文件编码格式为gbk

 或

  #-*- coding:utf-8 -*-

  # 设置源文件编码格式为utf-8

示例:

# -*- coding: gbk -*-

print("你好!")


#这是一个在windows写的txt文档,如果在linux运行,需要加(# -*- coding: gbk -*-)


作用:
  告诉解释执行器,此前文件的编码是什么?

 

练习:
  1. 写程序实现复制文件的功能
    要求:
    1. 要考虑特大文件问题
    2. 要关闭文件
    3. 要能复制二进制文件
 如:

  • 请输入源文件路径名:  /home/tarena/xxx.tar.gz
  • 请输入目标文件路径名: ./a.tar.gz

显示:
    文件已成功复制

try:
    src = open(src_filename, 'rb')  # 打开源文件用来读数据
    try:
        try:
            dst = open(dst_filename, 'wb')  # 打开目标文件用来写
            try:
                while True:
                    b = src.read(4096)
                    if not b:  # 已经再也读不到数据了
                        break
                    dst.write(b)
                print("复制成功")
            finally:
                dst.close()
        except OSError:
            print("打开写文件失败")
    finally:
        src.close()
except OSError:
    print("复制失败")

 

  2. 修改学生信息管理程序,要求加入两个功能:
      9)  保存信息到文件(si.txt)
     10) 从文件中读取数据(si.txt)

 

 


如果文章有错误,记得在评论区留言哦

 

 

 

 

 

 

 

 

 

 

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值