文件处理中的文件长度
Length of file in file handling
我尝试以不同的方式在 python 中查找文本文件的长度。但我怀疑他们为什么会显示这样的输出。
文本文件:
hello
this is a sample text file.
say hi to python
第一次尝试:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f_contents)}')
while len(f_contents) > 0:
print(f_contents, end="**")
f_contents = f.read(size_to_read)
输出:
第二次尝试:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f.read())}')
while len(f_contents) > 0:
print(f_contents, end="**")
f_contents = f.read(size_to_read)
输出:
第三次尝试:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f.readline())}')
while len(f_contents) > 0:
print(f_contents, end="**")
f_contents = f.read(size_to_read)
输出:
任何人都可以解释为什么这 3 个给出不同的输出。
首先尝试这部分代码 f_contents = f.read(size_to_read)
确实读取了 8 个字节,然后您只是在此处打印您的变量 print(f'the total length of file is {len(f_contents)}')
。在每次迭代中,您的代码一次读取 8 个字节。
在第二次尝试中,您也通过此代码 f_contents = f.read(size_to_read)
读取了 8 个字节,但通过此代码 print(f'the total length of file is {len(f.read())}')
打印给定文件中的总字节数(从头到尾完整读取文件)和然后您将继续从第 4 行 f_contents = f.read(size_to_read)
中的最后一个读取字节开始读取文件。
在第三次尝试中,您也通过此代码 f_contents = f.read(size_to_read)
读取了 8 个字节,但在这部分代码中 print(f'the total length of file is {len(f.readline())}')
您正在读取接下来的 8 个字节(从之前读取的 8 个字节开始)。因此,在这部分代码中,print(f_contents, end="**")
print 语句打印从文件中读取并保存在 f_contens
变量中的前 8 个字节,然后在最后一行 f_contents = f.read(size_to_read)
您正在读取 8 个字节,而不是开始来自前 8 个字节 f_content
变量,但由于 print(f'the total length of file is {len(f.readline())}')
.
而来自后 8 个字节
为了不被混淆,想想两件事:
首先,你现在在文件中的什么位置? (把它想象成鼠标的光标)。第二,您正在阅读多少数据。
with read()
没有参数,你从你所在的地方读取数据,直到文件末尾。 with argument,就是按照指定的参数,以字节为单位读取数据。
用readline()
你读了一行“从你现在所在的地方”,直到行尾。
不管你读了多少数据,你的位置就在那里,所以接下来的阅读过程从那里开始。
希望能解决您的困惑。
是读缓冲区的问题
第一种情况:
最初您读取 8 个字节,然后每次 while 循环迭代读取 8 个字节。这就是为什么它每次打印 8 个字节。
f_contents = f.read(size_to_read) # read 8 bytes
注意:您在打印 len 时没有使用 read
函数。
第二种情况
最初你读取 8 个字节,但在打印长度时你使用读取函数,默认情况下读取到结束。所以,在 while 循环中它没有得到任何字节。 (读取缓冲区已结束)
f_contents = f.read(size_to_read) # reading 8 bytes
print(f'the total length of file is {len(f.read())}') # read rest of the file
第三种情况
最初您读取 8 个字节,但是在打印长度时您使用了 readline,它依次读取完整的行和到达最后一行的缓冲区,并且在循环中它会按照循环中定义的每次迭代打印 8 个字节。
f_contents = f.read(size_to_read) # read 8 bytes
print(f'the total length of file is {len(f.readline())}') # read 1 line
为了更好地理解,请使用 f.tell()
获取缓冲区的当前位置。
参见下面案例 1 的示例:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f_contents)}')
while len(f_contents) > 0:
print(f_contents, end="**")
print("\nbytes reached -- {}".format(f.tell())) #current state here
f_contents = f.read(size_to_read)
我尝试以不同的方式在 python 中查找文本文件的长度。但我怀疑他们为什么会显示这样的输出。
文本文件:
hello
this is a sample text file.
say hi to python
第一次尝试:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f_contents)}')
while len(f_contents) > 0:
print(f_contents, end="**")
f_contents = f.read(size_to_read)
输出:
第二次尝试:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f.read())}')
while len(f_contents) > 0:
print(f_contents, end="**")
f_contents = f.read(size_to_read)
输出:
第三次尝试:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f.readline())}')
while len(f_contents) > 0:
print(f_contents, end="**")
f_contents = f.read(size_to_read)
输出:
任何人都可以解释为什么这 3 个给出不同的输出。
首先尝试这部分代码 f_contents = f.read(size_to_read)
确实读取了 8 个字节,然后您只是在此处打印您的变量 print(f'the total length of file is {len(f_contents)}')
。在每次迭代中,您的代码一次读取 8 个字节。
在第二次尝试中,您也通过此代码 f_contents = f.read(size_to_read)
读取了 8 个字节,但通过此代码 print(f'the total length of file is {len(f.read())}')
打印给定文件中的总字节数(从头到尾完整读取文件)和然后您将继续从第 4 行 f_contents = f.read(size_to_read)
中的最后一个读取字节开始读取文件。
在第三次尝试中,您也通过此代码 f_contents = f.read(size_to_read)
读取了 8 个字节,但在这部分代码中 print(f'the total length of file is {len(f.readline())}')
您正在读取接下来的 8 个字节(从之前读取的 8 个字节开始)。因此,在这部分代码中,print(f_contents, end="**")
print 语句打印从文件中读取并保存在 f_contens
变量中的前 8 个字节,然后在最后一行 f_contents = f.read(size_to_read)
您正在读取 8 个字节,而不是开始来自前 8 个字节 f_content
变量,但由于 print(f'the total length of file is {len(f.readline())}')
.
为了不被混淆,想想两件事:
首先,你现在在文件中的什么位置? (把它想象成鼠标的光标)。第二,您正在阅读多少数据。
with
read()
没有参数,你从你所在的地方读取数据,直到文件末尾。 with argument,就是按照指定的参数,以字节为单位读取数据。用
readline()
你读了一行“从你现在所在的地方”,直到行尾。
不管你读了多少数据,你的位置就在那里,所以接下来的阅读过程从那里开始。
希望能解决您的困惑。
是读缓冲区的问题
第一种情况: 最初您读取 8 个字节,然后每次 while 循环迭代读取 8 个字节。这就是为什么它每次打印 8 个字节。
f_contents = f.read(size_to_read) # read 8 bytes
注意:您在打印 len 时没有使用 read
函数。
第二种情况 最初你读取 8 个字节,但在打印长度时你使用读取函数,默认情况下读取到结束。所以,在 while 循环中它没有得到任何字节。 (读取缓冲区已结束)
f_contents = f.read(size_to_read) # reading 8 bytes
print(f'the total length of file is {len(f.read())}') # read rest of the file
第三种情况 最初您读取 8 个字节,但是在打印长度时您使用了 readline,它依次读取完整的行和到达最后一行的缓冲区,并且在循环中它会按照循环中定义的每次迭代打印 8 个字节。
f_contents = f.read(size_to_read) # read 8 bytes
print(f'the total length of file is {len(f.readline())}') # read 1 line
为了更好地理解,请使用 f.tell()
获取缓冲区的当前位置。
参见下面案例 1 的示例:
size_to_read = 8
with open('sample.txt', "r") as f:
f_contents = f.read(size_to_read)
print(f'the total length of file is {len(f_contents)}')
while len(f_contents) > 0:
print(f_contents, end="**")
print("\nbytes reached -- {}".format(f.tell())) #current state here
f_contents = f.read(size_to_read)