Python:扫描文件中的子字符串,保存位置,然后返回它
Posted
技术标签:
【中文标题】Python:扫描文件中的子字符串,保存位置,然后返回它【英文标题】:Python: scan file for substring, save position, then return to it 【发布时间】:2021-09-02 14:01:31 【问题描述】:我正在编写一个脚本,该脚本需要扫描文件直到找到出现子字符串的行,保存该行开头的位置,然后稍后返回。我对python很陌生,所以我还没有取得太大的成功。这是我当前的代码:
with open("test.txt") as f:
pos = 0
line = f.readline()
while line:
if "That is not dead" in line:
pos = f.tell() - len(line.encode('utf-8'))
# pos = f.tell()
line = f.readline()
f.seek(pos)
str = f.readline()
print(str)
带有 test.txt:
That is not dead
Which can eternal lie
Till through strange aeons
Even Death may die
Sphinx of black quartz, judge my vow!
这是输出:
hat is not dead
[newline character]
我意识到我原来的pos = f.tell()
给了我行的end 位置而不是开头,我发现this 回答详细说明了如何获取字符串的字节长度,但使用它会切断第一个字符。使用 utf-16 或 utf-16-le 分别给出 ValueError: negative seek position -18
或 ValueError: negative seek position -16
。我尝试使用this答案中的解决方案,使用以下代码:
with open("ctest.txt") as f:
pos = 0
line = f.readline()
while line:
if "That is not dead" in line:
print(line)
f.seek(-len(line), 1)
zz = f.readline()
print(zz)
line = f.readline()
f.seek(pos)
str = f.readline()
print(str)
给io.UnsupportedOperation: can't do nonzero cur-relative seeks
f.seek(-len(line), 1)
谁能指出我哪里出错了?
【问题讨论】:
为什么你需要保存位置,你不能只放置一个 if 语句或某事,当它到达那个字符串时会被触发,然后做你需要的任何事情,然后继续循环?跨度> 你有没有想过记住readline之前的位置并使用它,如果你有匹配? @Matiiss 否。脚本的其他部分需要根据所需子字符串的行来运行,更改该子字符串,然后再次运行。我不能一次完成。 @Stefan Papp 我认为我有一个可以实现您的建议的版本。谢谢! 【参考方案1】:Stefan Papp 建议在读取该行之前保存位置,这是一个我没有考虑过的简单解决方案。调整后的版本:
with open("test.txt") as f:
pos = 0
tempPos = 0
line = f.readline()
while line:
if "That is not" in line:
pos = tempPos
tempPos = f.tell()
line = f.readline()
f.seek(pos)
str = f.readline()
print(str)
输出正确:
That is not dead
[newline character]
谢谢,斯特凡。我想我对我的问题太深入了,无法清楚地思考它。 如果有比我所做的更好的方法来遍历文件,我很想知道,但这似乎可行。
【讨论】:
以上是关于Python:扫描文件中的子字符串,保存位置,然后返回它的主要内容,如果未能解决你的问题,请参考以下文章