(十六)python 文件

目录

文件 file

文件的操作流程

文件的打开函数open

文件的关闭方法

文本文件操作模式

文件的迭代读取:

二进制文件操作

F.seek() 函数

F.tell()函数:

小结:

编码注释:


文件 file

文件是用于数据存储的单位
文件通常用来长期存储数据
文件中的数据是以字节为单位进行顺序存储的

文件的操作流程

    1.打开文件
    2.读写文件
    3.关闭文件
    注:任何的操作系统,同一个应用程序同时打开文件的数量有最大数限制,所以在用完文件后需要关闭

文件的打开函数open

    open(file,mode='rt')
    用于打开一个文件,返回此文件流对象,如果打开文件失败,则会触发OSError错误

文件的关闭方法

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

    # 此示例示意文件的打开,读取及关闭
    try:
        #第一步打开文件
        f = open('day014.txt','rt')
        print("打开文件成功!")

        #第二步读取文件
        s = f.read() #读取全部内容
        print("文件中的内容是:",s)

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

文本文件操作模式

    模式字符:   
        't'  (默认)
    1.默认文件中存储的数据为字符数据,以行为单位分隔,在python内部统一用'\n'作为换行符进行分隔
    2.对文本文件的读写需要用字符串(str)进行读取和写入数据

    各操作系统的换行符:
        Linux换行符:          '\n'
        Windows换行符:        '\r\n'
        旧的Macintosh换行符:  '\r'
        新的Mac OS换行符:   '\n' 

    说明:
        在文件模式下,各操作系统的换行符在读入python内部时转换为字符'\n'

    练习:
        自己写一个文件info.txt,内部存储一些文字信息如下:
        小张 20  100
        小李  18  98
        小王19  95
        写程序将这些数据读取出来,打印在屏幕终端上

def read_file_content():
    L = []
    try:
        f = open('info.txt')
        while True:
            s = f.readline()  # '小张 20 100\n'
            if not s:
                break
            s2 = s.strip()  # '小张 20 100'
            name_age_score = s2.split()  # ['小张', '20', '100']
            n, a, s = name_age_score
            d = {'name': n, 'age': int(a), 'score': s}
            # d =  {'name': '小张', 'age': 20, 'score': 100}
            L.append(d)

        f.close()
    except OSError:
        print('打开文件失败')
    return L

if __name__ == '__main__':
    docs = read_file_content()
    print(docs)


文件的迭代读取:

    open返回的文件流对象是可迭代对象

        f = open('myfile.txt')
        for line in f :
            print(line)

    文本文件的写操作:
        写文件模式有:
        'w'
        'x'
        'a'
    详见:
        文件.html
 
练习:
    1.写一个程序,输入很多人的姓名,年龄,家庭住址信息,存入文件
    infos.txt中
    文件格式自己定义
    完后输入后查看文件格式是否是你想要的格式(文本文件操作)

    2.写一个程序读入infos.txt中的内容,以如下格式打印infos.txt中的内容
        姓名: xxx, 年龄:20, 住址: xxxx
        姓名: yyy, 年龄:18, 住址: yyyyy

二进制文件操作

    默认的文件中存储的都是以字节为单位的数据,通常有人为规则的格式,需要以字节为单位进行读写

    F.read()  的返回类型:
        1.对于文本模式('t')打开的文件,返回字符串(str)
        2.对于二进制模式('b')打开的文件,返回字节串(bytes)

    F.write(x)
        1.对于文本模式,x必须为字符串
        2.对于二进制模式,x必须为字节串

    以十六进制方式查看文件内容的命令:
        $ xxd 文件名

file = open('data.bin', 'rb')

b = file.read(1)  # 读取一个字节
print("第一个字节是:", b)

b = file.read() # 读取所有的字节
print('其它所有字节是: ', b)
file.close()
# 此示例示意以文本文件模式读取myfile.txt中的内容
try:
    f = open("myfile.txt")
    print('打开文件成功!')
    # 读取文件内容
    while True:
        s = f.readline()
        if s == '':
            print('已经读取到了文件末尾')
            break
        print("读到这一行是:", s)
    f.close()
except OSError:
    print("打开文件失败")
# 此示例示意以文本文件模式读取myfile.txt中的内容
try:
    f = open("myfile.txt")
    print('打开文件成功!')
    # 读取文件内容
    # s = f.read()
    s = f.read(3)  # 读取三个字符
    print('字符串s的长度是:', len(s), '内容是', s) # 'abc'
    s2 = f.read(3)
    print('第二次读取的字符是:', s2)  # '123'
    s3 = f.read(5)
    print('第三次拿到的字符是:', s3)  # '中文\nAB'
    s4 = f.read()
    print(s4)  # 'C英文\nhello world\n'

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

# 此示例示意以二进制方式写文件到'data.bin'
try:
    f = open('data.bin', 'wb')
    print("打开文件成功")
    # 写入数据
    b = b'\xe4\xb8\xad'
    f.write(b)
    f.write(b'\x00\x00')

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

 

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

f = open('mynote.txt', 'w')  # 'w' 代表以写模式打开文件

f.write('你好')
f.write('中国!')
f.write('\n')
f.write("hello china!")
f.writelines(['aaaa\n', 'bbbb\n', 'cccc\n'])

f.close()
# 此示例示意写文本文件操作

f = open('mynote.txt', 'at')  # 'a' 代表追加方式打开

f.write('我追加到了文件尾')

f.close()

练习:
将如下数据用二进制文件操作方式写入到文件data.txt中
数据如下:
  小李13888888899
  小王13666666666
  b = str.encode('utf-8')
  用sublime text3打开,看写入的内容能否被sublime识别并读出
 

name1 = '小李'
number1 = 13888888899
name2 = '小王'
number2 = 13666666666

file = open("data.txt", 'wb')

s = name1 + ' ' + str(number1) + '\n'
b = s.encode('utf-8')
file.write(b)  # 写入第一行数据
s = name2 + ' ' + str(number2) + '\n'
b = s.encode('utf-8')
file.write(b)  # 写入第二行数据

file.close() 

F.seek() 函数

F.seek(偏移量,相对位置)
偏移量:
      大于0的数代表向文件尾方向移动
      小于0的数代表向文件头方向移动
相对位置:
      0代表从文件头开始偏移
      1代表从当前开始偏移
      2代表从文件尾开始偏移
作用:
    改变当前文件的读写位置

F.tell()函数:

作用:
返回当前文件读写位置

# 此示例示意 用F.seek方法来定位文件的读写位置
# 注: seek 通常对 二进制模式打开的文件进行操作

f = open('myfile.bin', 'rb')
print("刚打开文件时,文件的读写位置是:", f.tell())  #0

b = f.read(2)
print('刚读入的内容是:', b)
print('读取两个字节后的读写位置是:', f.tell())  # 2

# 想读取第五个字节开始的5个字节
# 定位
# f.seek(5, 0)  # 从头开始向后移动5个字节的位置
# f.seek(3, 1)  # 从当前的读写位置向后移动3个字节的位置
f.seek(-15, 2)  # 从文件尾向前移动15个字节的位置

print("seek 移动后的读写位置是:", f.tell())  # 5
b = f.read(5)  # 读取5个字节
print(b)  # b'abcde'

f.close()


小结:

文件操作的两种模式:
'b'  二进制模式
't'  文本模式

文件操作:
  读read/readline/readlines
  写 write/writelines

汉子编码:
  问题:
    十个汉字占多少个字节:
只讲两种:
国标系列:
    GB18030(二字节或四字节编码,共27533个汉字)
    GBK(二字节编码,共21003个汉字)
    GB2312(二字节编码,共6763个汉字)
  国际标准:
    UNICODE32(UNICODE16) <---> UTF-8
    (Linux,Mac OS X,IOS,Android等常用)
说明:
python3的字符串内部都是用UNICODE来存储字符的

python 编码(encode) 字符串
'gb2312'
  'gbk'
  'gb18030'
  'utf-8'
  'ascii'


编码注释:

  在python源文件第一行或第二行写入如下内容是告诉解释执行器
  此文件的编码类型是什么
  如:
  # -*- coding: gbk -*-
    # 设置源文件编码格式为gbk
  或
  # -*- coding: utf-8 -*-
    # 设置源文件编码格式为utf-8

# -*- coding: gbk -*-
print("你好!")# 此示例示意gbk编码的源文件加上编码注释后
# 可以在python3下运行 

练习:
  1.写程序实现复制文件功能:
    要求:
     1) 多大的文件都能复制
     2) 要能复制二进制文件
     3) 要考虑关闭文件
如:
    请输入源文件: ../day15.tar.gz
    请输入目录文件: abc.tar.gz
    已复制文件,文件长度是: ....

  2.为学生信息管理项目添加两个功能
  |9) 保存学生信息到文件(si.txt)   |
    |10) 从文件中读取学生数据(si.txt) |
   (要求,每个功能只要有一个函数与之相对应)

src_file = input("请输入源文件: ")
dst_file = input("请输入目标文件: ")

# 先打开源文件,准备读数据
try:
    src = open(src_file, 'rb')
    try:
        # 打开目标文件,准备写数据
        try:
            dst = open(dst_file, 'wb')
            try:
                # 开始复制文件,每次复制4K字节,直至复制完成
                while True:
                    b = src.read(4096)  # 4096 = 4k
                    if not b:
                        print("复制成功")
                        break
                    dst.write(b)
            finally:
                dst.close()
        except OSError:
            print("打开写文件", dst_file, '失败')
    finally:
        src.close()
except OSError:
    print("打开文件", src_file, "失败!")


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值