《Python核心编程》第九章

《Python核心编程》第九章

9-1 文件对象

    文件只是连续的字节序列。数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成。

9-2 文件内建函数[open() 和 file()]

    open() 内建函数成功打开文件后时候会返回一个文件对象,否则引发一个错误。当操作失败,Python 会产生一个 IOError 异常。语法如下:

        file_object = open(file_name, access_mode=’r’, buffering=-1)

file函数和open一样,可以任意转换。不过python3.x好像已经废弃file函数了。

这里写图片描述

python3.x 和 python2.x 的区别可见这篇博文

9-3 文件内建方法

输入
read()、readline()、readlines()。

函数功能
read()读取字节到字符串中,最多读给定的size数,默认参数为-1,负数则读到文件末尾
readline()读取打开文件的一行。然后整行,包括行结束符,作为字符串返回。和read一样有个参数size,返回size个字节。
readlines()读取所有(剩余的)行然后把它们作为一个字符串列表返回。

输出
write() 和 writelines(),类似read() 和 readlines(),没有readline()方法。

文件内移动
seek(): 在文件中移动文件指针到不同的位置。使用方法可见这篇文章

文件迭代
举个例子:

f = open('e:/pygame/python/test.txt', 'r')
for eachline in f:
    print(eachline)

open()函数返回一个文件迭代器,可以直接使用,而不必像以前一样使用read*()方法。

文件方法杂项
例子:

file_name = 'e:/pygame/python/test.txt'
f = open(file_name,'r')
all_lines = f.readlines()
f.close()
for each_line in all_lines:
    print(each_line)

    这个程序读取完所有的行,才会开始执行输出语句。如果文件很大,这个方法不可取。我们可以使用迭代器,每次只读取和显示一行。

file_name = 'e:/pygame/python/test.txt'
f = open(file_name,'r')
for each_line in f:
    print(each_line,f.close())

    书上是这么写的,但执行有错误。我以为可以先打开文件,读取显示一行,关闭文件,如此反复。不过应该不行,应该是这样的:

file_name = 'e:/pygame/python/test.txt'
f = open(file_name,'r')
for each_line in f:
    print(each_line)
f.close()

     但这样不就一直占用文件句柄,浪费资源了吗?不懂!!!
os模块

os模块属性描述
linesep用于在文件中分隔行的字符串
sep分隔文件路径名的字符串
pathsep分隔文件路径的字符串
curdir当前工作目录的字符串名称
pardir(当前工作目录的)父目录字符串名称

不管什么平台,只要导入了os模块,这些变量自动会被设置为正确的值。
例子:
如何输出到文件:

import os


file_name = input('Enter file name: ')
file_path = 'E:\\pygame\\python\\'
file_name = file_path + file_name
print(file_name)
fobj = open(file_name, 'w')
while True:
    a_line = input('Enter a line (\'q\' to quit): ')
    if a_line != 'q':
        fobj.write('%s%s' % (a_line, os.linesep))
    else:
        break
fobj.close()

9-7 文件系统

9-11 练习

9.1 文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行。
附加题: 处理不是第一个字符开头的注释。

def show_lines(file_path):
    f = open(file_path, 'r')
    for line in f:
        if line.strip()[0] == '#':
            pass
        else:
            print(line)


def test():
    p = 'e:/pygame/python/test.txt'
    show_lines(p)


if __name__ == '__main__':
    test()

文件:
文件

执行结果:
执行结果

附加题:

def show_lines(file_path):
    f = open(file_path, 'r+')
    for each_line in f:
        each_line = each_line.strip()
        for i in range(len(each_line)):
            if each_line[i] == '#':
                each_line = each_line[:i]
                break
        print(each_line)


def test():
    p = 'e:/pygame/python/test.txt'
    show_lines(p)


if __name__ == '__main__':
    test()

文件:
文件

执行结果:
执行结果

9.2 文件访问。提示输入数字 N 和文件 F,然后显示文件 F 的前 N 行。

def read_n_lines(file_path, n):
    fobj = open(file_path, 'r')
    for each_line in fobj:
        if n:
            print(each_line.strip())
            n -= 1
    fobj.close()

执行结果:
结果

9.4 文件访问. 写一个逐页显示文本文件的程序. 提示输入一个文件名, 每次显示文本文件的 25 行, 暂停并向用户提示”按任意键继续.”, 按键后继续执行.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值