如何使用Python向文件的第n行写入内容

3
我想在特定行号写入一行内容,我的文件包含以下数据。
one
two
three
four
five
Six
Seven
Eight
Nine
Ten
Eleven

这是我的代码 -

f = open("file.txt",'r+')
for i, line in enumerate(f):
    if i == 2:
        f.write("Added at 2nd line")
    elif i == 3:
        f.write("Added at 2nd line")
    elif i > 29:
        break
f.close()

在运行上述代码后,我得到的输出如下:
one
two
three
four
five
Six
Seven
Eight
Nine
Ten
ElevenAdded at 2nd line

请帮我学习如何在文件中写入指定的数字


1
什么是第n行的意思?你是要替换一行还是添加一行? - Padraic Cunningham
1
你的问题描述不清楚。你是想从第二行开始覆盖,还是要插入新的行,或者替换掉原有的行?第一种情况很简单,而其他两种情况则需要重新编写文件的其余部分。 - tripleee
4个回答

2
我已经尝试过并且它确实有效,并且非常快速。
深入了解这个概念... linecache 如果不是这个,那么你需要做的是:
在Python中,文件是迭代器,意味着它们可以被循环遍历,或者对它们应用迭代操作。
例如,要获取每第5行,可以这样做:
import itertools

with open(filename, 'r') as f:
    fifthlines = itertools.islice(f, 0, None, 5)
    for line in fifthlines:
        # do something with line

要跳过一系列的行,请使用一个 noop 循环;在这里我们跳过 10 行,然后读取 10 行:

for _ in itertools.islice(f, 0, 10):
    pass

for line in itertools.islice(f, 0, 10):
    # do something with this 10th line

使用itertools库,再快速浏览Python教程,您就可以轻松理解剩下的脚本。


0

对于我来说,你的问题并不是很清楚,但这是我理解的方式。我尝试使用了你的方法,使用了enumerate和新变量line_num(你的行号),你可以在脚本中手动设置或从终端中设置:

main_file = open('file.txt', 'r')
lines = []
line_num = 4 # if you want set it manually from script
#line_num = input('Type the line number: ') # if you want to set it from terminal

for i, line in enumerate(main_file): 
    if i+1 != line_num:
        str_line = line
    else:
        # enumerate starts from zero so increment i by 1
        str_line = line.rstrip('\n')  + ' (added at %s line)\n' % (i+1) 
    lines.append(str_line)
    if i > 29: 
        break 

main_file.close()

with open('file.txt', 'w') as main_file:
    main_file.writelines(lines)

我将文件的工作分为两个部分: - 第一部分是读取文件行并将其添加到行列表中(包括编辑后的行) - 第二部分是使用with语句将行写入files.txt文件的writelines方法中。

-1

除非是直接(二进制)文件且具有固定大小的块,否则绝不要在正在读取的同一文件中写入!这样做可能会导致文件损坏,并且很难恢复。

在您的使用情况中,情况并不太糟糕。由于您使用了文件对象的迭代器接口,Python会一次性读取整个块(实际上是整个文件),并且文件指针立即定位到末尾。然后,您逐行获取文本,但当您写入时(有希望地)是在文件末尾写入。如果您使用readline读取文件,则您的写入操作将覆盖后续行。

正确的方法是重命名输入文件,以只读方式打开它,打开一个新的文件副本进行任意修改,如果一切都正常,则删除输入文件。

另一种简单的方法是,当文件较小时,将所有内容加载到内存中,然后在写回之前回溯文件

f = open("file.txt",'r+')
lines = f.readlines()
f.seek(0)
for i, line in enumerate(lines):
    if i == 2:
        f.write("Added at 2nd line")
    elif i == 3:
        f.write("Added at 2nd line")
    elif i > 29:
        break
f.close()

-2
你可以使用fileinput:
import fileinput

for line in fileinput.input('file.txt', inplace=True):
  if fileimput.filelineno() == 2: 
    print line.replace(line, 'Added at 2nd line\n'),

或者你需要写一个第二个文件:

with open('file.txt', 'r') as input_file, open('new_file.txt', 'w') as output_file:
  for line in input_file:
    if input_file.index(line) == 1:
      output_file.write('Added at 2nd line\n')
    else:
      output_file.write(line)

第一个函数将使用字符串覆盖你的整个文件。 - CapnShanty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接