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 -18ValueError: 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 seeksf.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:扫描文件中的子字符串,保存位置,然后返回它的主要内容,如果未能解决你的问题,请参考以下文章

python,如何获取字符串中的子字符串,部分字符串

如何将文本文件中的一行的子字符串保存到字符串数组中?

包含特定字符的给定字符串的子字符串数

用python更改xml文件中的子字符串

w10电脑开机 蓝屏您的电脑/设备需要恢复文件amdkmpfd.sys?

ubuntu怎么执行python文件