gpt4 book ai didi

python - python中seek()和split()的不稳定(看似随机)行为

转载 作者:行者123 更新时间:2023-12-01 04:00:24 25 4
gpt4 key购买 nike

考虑以下代码:

import sys
with open(sys.argv[1]) as data_file:
data_file.readline() #skipping lines of texts
data_file.readline()
data_file.readline() #skipping lines of texts
data_file.readline()
data_file.readline() #skipping lines of texts
data_file.readline() #skipping lines of texts
data_file.readline() #skipping lines of texts
data_file.readline() #skipping lines of texts
data_file.readline() #skipping lines of texts
while True:
print "#"
pos=data_file.tell()
next_mol=data_file.readline().split()
print next_mol
data_file.seek(pos)
print data_file.readline().split()

这里sys.argv[1]是文本文件的名称,其中包含以下数据:

ITEM: TIMESTEP
31500000
ITEM: NUMBER OF ATOMS
28244
ITEM: BOX BOUNDS pp pp pp
0.706774 63.6072
1.77317 62.6918
-4.27518 67.4572
ITEM: ATOMS id type x y z
1 1 8.07271 20.6394 38.953
2 1 7.45444 20.2706 37.5682
3 1 7.94593 21.3438 36.5822
4 2 8.88701 22.2414 37.422
5 6 8.97587 21.7898 38.6976
6 7 9.51512 23.1098 36.8675
7 1 9.83459 22.2787 39.7728
8 3 8.54346 19.7726 39.3733
9 3 7.3188 20.9572 39.6053
10 3 6.33686 20.2798 37.6457
11 3 7.62824 19.2464 37.1935
12 3 7.14438 21.9616 36.2781
13 3 8.4454 20.9589 35.6742
14 3 9.51704 23.2023 40.2712
15 3 10.839 22.4705 39.342
16 3 9.84061 21.5031 40.5668

给我以下输出:

#
['1', '1', '8.07271', '20.6394', '38.953']
['71', '20.6394', '38.953']
#
['2', '1', '7.45444', '20.2706', '37.5682']
['1', '7.45444', '20.2706', '37.5682']
#
['3', '1', '7.94593', '21.3438', '36.5822']
['1', '7.94593', '21.3438', '36.5822']
#
['4', '2', '8.88701', '22.2414', '37.422']
['2', '8.88701', '22.2414', '37.422']
#
['5', '6', '8.97587', '21.7898', '38.6976']
['6', '8.97587', '21.7898', '38.6976']
#
['6', '7', '9.51512', '23.1098', '36.8675']
['7', '9.51512', '23.1098', '36.8675']
#
['7', '1', '9.83459', '22.2787', '39.7728']
['1', '9.83459', '22.2787', '39.7728']
#
['8', '3', '8.54346', '19.7726', '39.3733']
['3', '8.54346', '19.7726', '39.3733']
#
['9', '3', '7.3188', '20.9572', '39.6053']
['3', '7.3188', '20.9572', '39.6053']
#
['10', '3', '6.33686', '20.2798', '37.6457']
['0', '3', '6.33686', '20.2798', '37.6457']

我期望“#”之间的两个字符串相同。我在这里错过了什么吗?

最佳答案

file.readline()使用预读缓冲区来查找换行符,因此它可以返回一个以 \n 结尾的整齐的行。 。另一种方法是逐字节读取,直到找到换行符为止,这效率极低。

因此,您的第一个 file.readline()从文件中读取一大块信息,解析出第一行并将其返回。然后下一个电话 file.readline()很可能能够单独为您提供缓冲区中的下一行,等等。

当您到达while时循环中,预读缓冲区已被填充到1 1 8.072为止的所有内容。 (ITEM: ATOMS id type x y z 行之后的第一个字节)。下一个file.readline()然后调用读取更多缓冲区以查找另一个换行符,将文件位置移动到初始 2 之后。在下一行等。

您无法从文件中可靠地获取正确的文件位置并且使用 file.readline()来电;您必须考虑读取的行数、实际缓冲区大小以及文件中使用的行分隔符的样式。您的问题几乎肯定可以通过不同的方式解决,例如将已读取的行存储在队列或某种类型的堆栈中,以便在循环的后续迭代中使用。

关于python - python中seek()和split()的不稳定(看似随机)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36663287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com