gpt4 book ai didi

python - 尝试做一个程序来替换给定的行,由同一行但全部大写

转载 作者:太空狗 更新时间:2023-10-30 01:25:00 26 4
gpt4 key购买 nike

尝试做一个大学练习,我应该用同一行但全部大写来替换文件中的给定行。问题是我们只能写入同一个文件,而不能写入文件的其余部分。

这是我目前的代码,但我不知道如何转到我想要的行

def upper(n):
count=0
with open("upper.txt", "r+") as file:
lines = file.readlines()
file.seek(0)
for line in file.readlines():
if count == n:
pos = file.tell()
line1 = str(line.upper())

count += 1
file.seek(pos)
file.write(line1)

感谢帮助!

最佳答案

问题在于您的readlines 已经 读取了整个文件,因此“文件光标”的位置始终在文件末尾。理论上,一个简单的修复应该是:

  1. pos初始化为0。
  2. 阅读一行。
  3. 如果当前行计数器指示这是您想要的行,请再次将位置设置为 pos,更新该行,然后退出。
  4. 更新 pos 以指向 行的末尾(因此它指向 行的开头)。
  5. 循环直到满意。

在代码中,应该是这样的:

def upper(n):
count=0
with open("text.txt", "r+") as file:
pos = 0
for line in file.readlines():
if count == n:
line1 = line.upper()
break

pos = file.tell()
count += 1
file.seek(pos)
file.write(line1)

upper(5)

但是!有一个障碍。文件操作被大量缓冲,readlines 上的 for 循环不会一次读取一行。相反,为了提高效率,它会尽可能多地读取,但它只会将下一行“返回”给您的程序。在循环的下一次运行中,它只是检查它是否已经读取了足够的文本文件以返回以下行,如果没有,它会再次填充其内部缓冲区。因此,即使 tell() 将正确更新到外部文件位置——您看到的值——,它不会反射(reflect)“您当时正在处理的内容的光标”位置。

避免这种情况的一种方法是在物理上模仿 readlines 的作用:一次读取一个字节,确定您是否已经读取了整行(那么这个字节将是 \n ),并据此更新你的位置和状态。

然而,更合适的更新文件的方法是将其整个读入内存,更改它,然后将其写回磁盘。使用 "r+" 更改现有文件的一部分通常建议使用二进制模式(每个字节的位置事先已知);不可否认,理论上您的方法也应该有效,但正如您所见,文件缓冲会破坏这一点。

完全读取、更改和写入文件就这么简单:

def better_upper(n):
count=0
with open("text.txt", "r") as file:
lines = file.readlines()
lines[n] = lines[n].upper()
with open("text.txt", "w") as file:
file.writelines(lines)

better_upper(5)

(唯一需要注意的是它总是覆盖原始文件。也就是说:如果出现意外错误,它可能会删除 text.txt。如果你想要一个腰带和吊带方法,写入一个新文件,然后检查它是否写入正确。如果正确,删除旧文件并重命名新文件。留给读者作为练习。)

关于python - 尝试做一个程序来替换给定的行,由同一行但全部大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53694195/

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