Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 修改行_Python_File_File Handling - Fatal编程技术网

Python 修改行

Python 修改行,python,file,file-handling,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(s

我希望加载一个文件并将几个预定义的行修改为某些值。 以下是我尝试的:

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

我做错了什么?

您以只写模式(
w
模式)打开文件并尝试读取它-这是通过
for
语句完成的

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

如果您计划写入,则文件本身上的for无法帮助您-只需使用带有“range”的普通计数器并写入即可

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
, 每一行都是独立的-yu不显示您的VAIABLE的内容,但是如果您想要确切的行号,那么看起来
writelines
不是您想要的

(另一方面,请注意缩进-在Python中输入的每个块都应该标识一个固定的amount-它将像您一样使用任意标识,但在Python代码中并不常见)

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


您以只写模式(
w
模式)打开文件并尝试读取它-这是通过
for
语句完成的

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

如果您计划写入,则文件本身上的for无法帮助您-只需使用带有“range”的普通计数器并写入即可

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
, 每一行都是独立的-yu不显示您的VAIABLE的内容,但是如果您想要确切的行号,那么看起来
writelines
不是您想要的

(另一方面,请注意缩进-在Python中输入的每个块都应该标识一个固定的amount-它将像您一样使用任意标识,但在Python代码中并不常见)

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


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

要获取文件行数,可以使用:


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

要获取文件行数,可以使用:


您所做的就是就地编辑。为此,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
    ,如上所示
  • 对于i,f中的行不起作用,我想你的意思是
    对于i,枚举(f,1)中的行
  • 有非常深的凹痕是什么
  • if
    语句应该是
    if。。。埃利夫。。。else
    。当前,else子句仅附加到
    if i==4
    语句,而不是其他两个语句

    • 您所做的工作称为就地编辑。为此,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
        ,如上所示
      • 对于i,f中的行不起作用,我想你的意思是
        对于i,枚举(f,1)中的行
      • 有非常深的凹痕是什么
      • if
        语句应该是
        if。。。埃利夫。。。else
        。当前,else子句仅附加到
        if i==4
        语句,而不是其他两个语句

      您正在使用
      w
      以仅写模式打开文件。即便如此,即使你改变了,这也不行;您不能简单地写入文件的中间部分(至少不覆盖其余部分)。请参见以下答案:我认为您在任何情况下都希望枚举(f)中的I行
      。您正在使用
      w
      ,仅写模式打开文件。即便如此,即使你改变了,这也不行;您不能简单地写入文件的中间(至少不覆盖其余部分)。请看下面的答案:我想您可能希望
      用于I,