• p20 函数和文件


     1 from sys import argv
     2 
     3 script, input_file = argv
     4 
     5 def print_all(f):
     6     print f.read()
     7 
     8 def rewind(f):
     9     f.seek(0)
    10 
    11 def print_a_line(line_count, f):
    12     print line_count, f.readline()
    13 
    14 current_file = open(input_file)
    15 
    16 print "First let's print the whole file:\n"
    17 
    18 print_all(current_file)
    19 
    20 print "Now let's rewind, kind of like a tape."
    21 
    22 rewind(current_file)
    23 
    24 print "Let's print three lines:"
    25 
    26 current_line = 1
    27 print_a_line(current_line, current_file)
    28 
    29 current_line = current_line + 1
    30 print_a_line(current_line, current_file)
    31 
    32 current_line = current_line + 1
    33 print_a_line(current_line, current_file)
    34  

    print_all 和其它函数里的 f是什么?
    和 Ex 18 里的一样, f 只是一个变量名而已,不过在这里它指的是一个文件。Python 里的文件就和老式磁带机,或者 DVD 播放机差不多。它有一个用来读取数据的“磁头”,你可以通过这个“磁头”来操作文件。每次你运行 f.seek(0) 你就回到了文件的开始,而运行 f.readline() 则会读取文件的一行,然后将“磁头”移动到 \n后面。后面你会看到更详细的解释。
    问什么文件里会有间隔空行?
    readline() 函数返回的内容中包含文件本来就有的 \n,而 print 在打印时又会添加一个 \n,这样一来就会多出一个空行了。解决方法是在 print 语句结尾加一个逗号 ,,这样 print 就不会把它自己的 \n打印出来了。
    为什么 seek(0) 没有把 current_line设为 0?
    首先 seek() 函数的处理对象是 字节 而非行,所以 seek(0) 只是转到文件的 0 byte,也就是第一个 byte 的位置。其次, current_line只是一个独立变量,和文件本身没有任何关系,我们只能手动为其增值。
    readline()是怎么知道每一行在哪里的?
    readline() 里边的代码会扫描文件的每一个字节,直到找到一个 \n 为止,然后它停止读取文件,并且返回此前的文件内容。文件 f 会记录每次调用 readline() 后的读取位置,这样它就可以在下次被调用时读取接下来的一行了。


     

  • 相关阅读:
    LeetCode34 Search for a Range
    LeetCode32 Longest Valid Parentheses
    LeetCode33 Search in Rotated Sorted Array
    LeetCode31 Next Permutation
    LeetCode30 Substring with Concatenation of All Words
    LeetCode29 Divide Two Integers
    2016 Multi-University Training Contest 8
    2016 Multi-University Training Contest 9
    Gym 100285G Cipher Message 3
    背包九讲
  • 原文地址:https://www.cnblogs.com/linuxroot/p/2753387.html
Copyright © 2020-2023  润新知