• 练习20--函数和文件


    一 seek()函数

    1 功能:seek() 方法用于移动文件读取指针到指定位置。

    2 语法:

    fileObject.seek(offset[, whence])

    3 参数:

    • offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
    • whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

    4 返回值:如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。

    二 代码及执行结果

    1 代码文件ex20.py:

    # 从sys模块中导入argv参数变量
    from sys import argv
    # 把从命令行的到的参数分别赋值给script,input_file这两个变量
    script,input_file = argv
    
    # 定义一个print_all函数,其功能是读文件,并打印出来
    def print_all(f):
        print(f.read())
    
    # 定义一个rwind函数,其功能是seek() 方法用于移动文件读取指针到文件开头。
    def rewind(f):
        f.seek(0)
    
    # 定义一个print_a_line函数,其功能是读取文件中line_count行的内容
    def print_a_line(line_count,f):
        print(line_count,f.readline())
    
    # 定义实参current_file并打开文件input_file  
    # current_file = input_file
    current_file = open(input_file)
    
    # 调用函数print_all读取文件current_file的所有内容,并打印
    print("First let's print the whole file:
    ")
    # current_file = f
    print_all(current_file)
    
    # 调用rewind,将文件读取指针移动到文件开头
    print("Now let's rewind, kind of like a tape.")
    # current_file = f
    rewind(current_file)
    
    # 调用print_a_line函数分别读取current_file文件的1,2,3行内容并打印
    print("Let's print three lines:")
    
    # current_file = f
    # current_line = 1
    current_line = 1
    # line_count = current_line
    print_a_line(current_line,current_file)
    
    # current_line = 2
    current_line += 1
    print_a_line(current_line,current_file)
    
    # current_line = 3
    current_line += 1
    print_a_line(current_line,current_file)

    2 执行结果

    PS E:3_work4_python2_code_python2_LearnPythonTheHardWay> python ex20.py test.txt
    First let's print the whole file:
    
    I
    Love
    You
    
    Now let's rewind, kind of like a tape.
    Let's print three lines:
    1 I
    
    2 Love
    
    3 You

    三 一些问题

    1 在 print_all和其他函数里的 f 是什么东西?

    • f 是一个变量,就像你在练习 18 中函数的变量一样,只不过这次它是一个文件。文件在 Python 里面有点类似于一个老式电脑里面的磁带驱动器,或者一个 DVD 播放机。它有一个“读取头”(read head),你可以在文件里 seek (寻找)这个读取头所在的位置,然后在那里工作。每次你做 f.seek(0) 的时候你都会从移动到文件最开始,每次你做 f.readline() 的时候,你都在从文件里读取一行内容,并且把读取头移动到 后面,也就是每行结束的地方。 我会在后面给你做更详细的解释。

    2 为什么 seek(0) 没有把 current_line 设置为 0?

    • 首先, seek() 函数处理的是字节(bytes),不是行。 seek(0) 这个代码把文件移动到 0 字节(也就是第一个字节处)。其次, current_line 只是一个变量并且跟这个文件没有任何实际联系。我们是在手动累加它。

    3 readline() 是怎么知道每一行在哪里的?

    • readline() 里边的代码会扫描文件的每一个字节,直到找到一个 为止,然后它停止读取文件,并且返回此前的文件内容。文件 f 会记录每次调用 readline() 后的读取位置,这样它就可以在下次被调用时读取接下来的一行了。

    4 为什么文件中的行之间会有空行?

    • readline() 函数返回文件中每行最后的 。又在 print函数的结尾加上一个 end = " " 来避免给每行加上两个 。
  • 相关阅读:
    微信小程序开发之普通链接二维码
    微信小程序之使用本地接口开发
    c# partial 分部类和分部方法
    .NET之美 第一部分C#语言基础
    Head First设计模式之命令模式
    Head First设计模式之责任链模式
    Head First设计模式之解释器模式
    Head First设计模式之迭代器模式
    Head First设计模式之中介者模式
    LeetCode 709. To Lower Case
  • 原文地址:https://www.cnblogs.com/luoxun/p/13237169.html
Copyright © 2020-2023  润新知