Python seek() 后跟 readline() 给出空字符串
Python seek() followed by a readline() gives empty string
我正在使用与此处问题类似的内容:
Python: Undo a Python file readline() operation so file pointer is back in original state
但似乎行为不端。
我的代码:(运行时的值显示为注释)
def parse_shell(self, filename):
output = None
with open(self.shells_path + filename) as fp:
first_line = fp.readline()
# first_line = 'Last login: Tue Jun 9 07:13:26 on ttys0'
while len(string.split(first_line, '$')) == 1:
last_pos = fp.tell()
# last_pos = 43
first_line = fp.readline()
# first_line =' 2015-06-09 08:18:23 [coryj@Corys-MacBook-Pro ~]$ ping 10.2.2.1'
fp.seek(last_pos)
for line in fp.readline():
# line = ''
line_chunks = string.split(line, '$')
根据文档,如果 readline() 到达 EOF,readline() 应该只 return 一个空字符串。
这个特定的文件超过 200k,所以我不明白为什么我会得到一个空字符串。
问题在于语句:
while len(string.split(first_line, '$')) == 1:
不能为 True,因此脚本永远不会进入 while 循环。
string.split()
将生成最少两个成员的列表,如 ["some",""]
,因此至少 len = 2。
此外,while 循环将 运行 while 语句 True
,如果变为 False
则退出。
希望对您有所帮助!如果您觉得对您有用,请采纳我的回答。 :-)
就像 o11c 和劳伦斯说的:
for line in fp.readlines()
有效
for line in fp
有效
for line in fp.readline()
不是有效的结构。
我不明白 string.split
是什么?你是说 str.split
吗?从你正在尝试做的事情来看 - 看起来 - 你想将所有包含 $
的行分成几部分并忽略其他行。在您的特定情况下,这些行似乎在文件的开头。一个更简单的方法是
for line in fp:
if line.find('$') >= 0:
line.split('$') # or str.split(line, '$')
其他人已经指出了这一点,但仍然 - line in fp.readlines()
与 line in fp.readline()
不同。前者将遍历列表中收集的文件的所有行,后者将仅遍历一行的所有字符。
您尝试做的是 line in fp.readline()
实际上是在尝试遍历该行的内容 - 这可能 不是您想要的。
' 2015-06-09 08:18:23 [coryj@Corys-MacBook-Pro ~]$ ping 10.2.2.1'
所以改成line in fp
(首选)或line in fp.readlines()
。你应该很好
希望对您有所帮助。
我正在使用与此处问题类似的内容:
Python: Undo a Python file readline() operation so file pointer is back in original state
但似乎行为不端。
我的代码:(运行时的值显示为注释)
def parse_shell(self, filename):
output = None
with open(self.shells_path + filename) as fp:
first_line = fp.readline()
# first_line = 'Last login: Tue Jun 9 07:13:26 on ttys0'
while len(string.split(first_line, '$')) == 1:
last_pos = fp.tell()
# last_pos = 43
first_line = fp.readline()
# first_line =' 2015-06-09 08:18:23 [coryj@Corys-MacBook-Pro ~]$ ping 10.2.2.1'
fp.seek(last_pos)
for line in fp.readline():
# line = ''
line_chunks = string.split(line, '$')
根据文档,如果 readline() 到达 EOF,readline() 应该只 return 一个空字符串。 这个特定的文件超过 200k,所以我不明白为什么我会得到一个空字符串。
问题在于语句:
while len(string.split(first_line, '$')) == 1:
不能为 True,因此脚本永远不会进入 while 循环。
string.split()
将生成最少两个成员的列表,如 ["some",""]
,因此至少 len = 2。
此外,while 循环将 运行 while 语句 True
,如果变为 False
则退出。
希望对您有所帮助!如果您觉得对您有用,请采纳我的回答。 :-)
就像 o11c 和劳伦斯说的:
for line in fp.readlines()
有效
for line in fp
有效
for line in fp.readline()
不是有效的结构。
我不明白 string.split
是什么?你是说 str.split
吗?从你正在尝试做的事情来看 - 看起来 - 你想将所有包含 $
的行分成几部分并忽略其他行。在您的特定情况下,这些行似乎在文件的开头。一个更简单的方法是
for line in fp:
if line.find('$') >= 0:
line.split('$') # or str.split(line, '$')
其他人已经指出了这一点,但仍然 - line in fp.readlines()
与 line in fp.readline()
不同。前者将遍历列表中收集的文件的所有行,后者将仅遍历一行的所有字符。
您尝试做的是 line in fp.readline()
实际上是在尝试遍历该行的内容 - 这可能 不是您想要的。
' 2015-06-09 08:18:23 [coryj@Corys-MacBook-Pro ~]$ ping 10.2.2.1'
所以改成line in fp
(首选)或line in fp.readlines()
。你应该很好
希望对您有所帮助。