修改线条

时间:2016-09-29 14:53:20

标签: python file file-handling

我希望加载文件并将若干预定义行修改为特定值。 以下是我的尝试:

with open("test.txt",'w') as f:
                for i,line in f:
                    if (i == 2):
                        f.writelines(serial1)
                    if (i == 3):
                        f.writelines(serial2)
                    if (i == 4):
                        f.writelines(serial3)
                    else:
                        f.writelines(line)

但是,运行代码时出现以下错误:

for i,line in f:
io.UnsupportedOperation: not readable

我做错了什么?

3 个答案:

答案 0 :(得分:2)

您正在做的事情称为编辑。为此,Python标准库fileinput可以提供帮助:

import fileinput

for line in fileinput.input('test.txt', inplace=True):
    if fileinput.lineno() == 2:
        print serial1
    elif fileinput.lineno() == 3:
        print serial2
    elif fileinput.lineno() == 4:
        print serial3
    else:
        print line

更新

至于“我做错了什么?”有一对:

  • 你打开文件进行写作,你怎么能从中读取?您可能尝试将模式从“w”更改为“r +”,即读写。这带来了另一个困境:在读取第2行之后,文件指针位于第3行的开头,您编写的任何内容都将覆盖第3行,更不用说旧行和新行之间的长度差异了。最好写入新的临时文件,然后在完成时将其复制回原始文件,或者如上所示使用fileinput
  • for i, line in f不起作用,我认为您的意思是for i, line in enumerate(f, 1)
  • 什么是极深的缩进?
  • if语句应为if ... elif ... else。目前,您的else子句仅附加到if i == 4语句,而不是其他两个。

答案 1 :(得分:1)

您打开文件以进行只写(for模式)并尝试阅读 - 这是由for语句完成的。

即:在读取文件时,使用for语句迭代文件。

如果您打算写信给它,{file}上的with open("test.txt",'w') as f: for i in range(desired_lines): if (i == 2): f.write(serial1 + "\n") if (i == 3): f.write(serial2 + "\n") if (i == 4): f.write(serial3 + "\n") else: f.write(line + "\n") 无法帮助您 - 只需使用普通计数器"范围"并写信给它。

writelines

此外,如果您有要编写的字符串列表,则应使用writelines, 每个单独的行 - yu不显示你的vaiables的内容,但鉴于你想要确切的行号,看起来import os ... lines_to_change{ 2: serial1, 3: serial2, 4: serial3, } with open("test.txt",'rt') as input_file, open("newfile.txt", "wt") as output_file: for i, line in enumerate(input_file): if i in lines_to_change: output_file.write(lines_to_change[i] + '\n') else: output_file.write(line) os.rename("test.txt", "test_old.txt") os.rename("newfile.txt", "test.txt") os.unlink("test_old.txt") 不是你想要的。

(在旁注 - 提防缩进 - 你应该识别你在Python中输入的固定ammount foreach块 - 它将像你一样使用仲裁标识,但在Python代码中并不常见)

<强>更新 看起来您需要更改现有文本文件的某些行。到目前为止,最好的方法是重新创建另一个文件,替换所需的行,然后重命名所有内容。 (在文本文件上写入几乎不可行,因为所有文本行必须与以前存在的行大小相同 - 并且在低级别磁盘访问中仍然无法获得任何内容。)

FlLoadMembers()

答案 2 :(得分:0)

正如所指出的,您的问题是您尝试在同一个文件中读写。最简单的方法是打开一个新文件,并在有所需输出时替换第一个文件。

要获取文件行号,您可以使用enumerate

with open("test.txt",'r') as f:
                for i,line in enumerate(f):
                    if (i == 2):
                        f.writelines(serial1)
                    if (i == 3):
                        f.writelines(serial2)
                    if (i == 4):
                        f.writelines(serial3)
                    else:
                        f.writelines(line)