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
。当前,else子句仅附加到if。。。埃利夫。。。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
。当前,else子句仅附加到if。。。埃利夫。。。else
语句,而不是其他两个语句if i==4
w
以仅写模式打开文件。即便如此,即使你改变了,这也不行;您不能简单地写入文件的中间部分(至少不覆盖其余部分)。请参见以下答案:我认为您在任何情况下都希望枚举(f)中的I行
。您正在使用w
,仅写模式打开文件。即便如此,即使你改变了,这也不行;您不能简单地写入文件的中间(至少不覆盖其余部分)。请看下面的答案:我想您可能希望用于I,