我可以使用enumerate
进入该文件并阅读该行,但我无法弄清楚如何更改该行。
fileinput
方法覆盖文件,open()
中的append方法只会附加到文件的末尾。
我想在保持文件的其余部分完好无缺的情况下,仅覆盖并覆盖文件中的某一行。
with open('test2.py', 'r+') as f:
for i, line in enumerate(f):
if i == 4:
if line != '2':
line = '2'
f.write(line)
print line
我在上面的代码中没有收到任何错误,只是在终端中打印'2'
,但它不会将test2.py
中的文字行更改为'2'
。
test2.py将是
#
#
#
'''
4
'''
#
我需要更改4到2
答案 0 :(得分:1)
" line =' 2'"只是意味着将内存中的变量更改为' 2'。文件内容保持不变。然后,你写了' 2'到test2.py。它只是附加了' 2'到test2.py。
我认为在写入用" r +"打开的文件时会出错,但它没有。它只是附加。
可能的解决方案(虽然效率不高):
lines = []
with open('test2.py', 'r+') as f:
for i, line in enumerate(f):
if i == 4:
if line != '2':
line = '2'
lines.append(line)
with open('test2.py', 'w') as f:
for line in lines:
f.write(line)
在:
12312312
123123123
1231231231
后:
12312312
123123123
2
答案 1 :(得分:1)
fileinput方法覆盖文件
因此:
1)对于您不想改变的行,请写下原始行 2)对于你想要改变的行,写下别的东西。
import fileinput as fi
with fi.input(
files = 'data.txt',
inplace = True,
backup = '.bak') as f:
for line in f:
if fi.lineno() == 4:
print('hello')
else:
print(line, end='')
~/python_programs$ cat data.txt
line 1
line 2
line 3
line 4
line 5
line 6
~/python_programs$ p34 1.py
~/python_programs$ cat data.txt
line 1
line 2
line 3
hello
line 5
line 6
或许你想这样做:
~/python_programs$ cat data.txt
line 1
line 2
line 3
line 4
line 5
line 6
~/python_programs$ p34 1.py
~/python_programs$ cat data.txt
line 1
line 2
line 3
line 4
extra line
line 5
line 6
import fileinput as fi
with fi.input(
files = 'data.txt',
inplace = True,
backup = '.bak') as f:
for line in f:
if fi.lineno() == 4:
print(line, end='')
print('extra line')
else:
print(line, end='')
修改强>
~/python_programs$ cat data.txt
#
#
#
'''
4
'''
#
~/python_programs$ p 1.py
~/python_programs$ cat data.txt
#
#
#
'''
2
'''
#
import fileinput as fi
f = fi.input(
files = 'data.txt',
inplace = True,
backup = '.bak'
)
for line in f:
newline_removed = line.rstrip()
if newline_removed == '4':
print '2'
else:
print(newline_removed) #print() adds a newline to end of text
f.close()
答案 2 :(得分:0)
首先,您以读取(r+
)模式打开它。请改用write(w+
)。
第二个(也是更重要的)在这里用2
覆盖文件内容。
所以我这样做:
with open('test2.py', 'w') as f:
lines = f.readlines()
if lines[4] != '2':
lines[4] = 2
f.writelines(lines)
答案 3 :(得分:0)
您无法直接在文件中更改行。您应该打开文件进行阅读,阅读所有行,进行所有更改。关闭文件并重新打开以进行写入,而不是写入已更改的数据。
with open('test2.py', 'r') as f:
mylines = f.readlines()
## changes here
with open('test2.py', 'w') as f:
f.write(newdata)
答案 4 :(得分:0)
我建议使用file.readlines()
,file.writelines
并像这样切片:
>>> with open('file') as f:
... a = f.readlines()
>>> a
['1\n', '2\n', '3\n', '4\n', '5\n', '6\n', '7\n', '8\n', '9\n']
>>> if a[4] != '2'+'\n':
... a[4] = '2'+'\n'
>>> a
['1\n', '2\n', '3\n', '4\n', '2\n', '6\n', '7\n', '8\n', '9\n']
>>> with open('file', 'w') as f:
... f.writelines(i)