我希望加载文件并将若干预定义行修改为特定值。 以下是我的尝试:
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
我做错了什么?
答案 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
至于“我做错了什么?”有一对:
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)