如何使用枚举读取和更改python中的特定行?

时间:2015-11-21 08:21:03

标签: python file-io

我可以使用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

5 个答案:

答案 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)