如何用lin替换(更新)文件行中的文本

2024-09-24 20:24:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过读取每一行来替换文本文件中的文本,对其进行测试,然后在需要更新时进行写入。我不想另存为一个新文件,因为我的脚本已经先备份文件并对备份进行操作。

这是我到目前为止所拥有的。。。我从os.walk()获取fpath,并保证pathmatch变量返回正确:

fpath = os.path.join(thisdir, filename)
with open(fpath, 'r+') as f:
    for line in f.readlines():
        if '<a href="' in line:
            for test in filelist:
                pathmatch = file_match(line, test)
                    if pathmatch is not None: 
                        repstring = filelist[test] + pathmatch
                        print 'old line:', line
                        line = line.replace(test, repstring)
                        print 'new line:', line
                        f.write(line)

但最终的结果是,我只得到了几行(更新正确,请注意,但重复从文件的前面)更正。我认为这是一个范围问题,阿法特。

*另外:我想知道如何只在匹配的第一个实例上替换文本,例如,我不想匹配显示文本,只匹配底层的href。


Tags: 文件intest文本forifosline
3条回答
  1. 打开文件进行读取,并将所有行复制到内存中。关闭文件。
  2. 对内存中的行应用转换。
  3. 打开要写入的文件,并将内存中的所有文本行都写出来。

    1. with open(filename, "r") as f:
          lines = (line.rstrip() for line in f)
          altered_lines = [some_func(line) if regex.match(line) else line for line in lines]
      with open(filename, "w") as f:
          f.write('\n'.join(altered_lines) + '\n')
      

替换文件行的(相对)安全的方法。

#!/usr/bin/python 
# defensive programming style
# function to replace a line in a file
# and not destroy data in case of error

def replace_line(filepath, oldline, newline ):
  """ 
  replace a line in a temporary file, 
  then copy it over into the 
  original file if everything goes well

  """

 # quick parameter checks 
  assert os.exists(filepath)          # ! 
  assert ( oldline and str(oldline) ) # is not empty and is a string
  assert ( newline and str(newline) )

  replaced = False
  written  = False

  try:

    with open(filepath, 'r+') as f:    # open for read/write -- alias to f       

      lines = f.readlines()            # get all lines in file

      if oldline not in lines:
          pass                         # line not found in file, do nothing

      else:
        tmpfile = NamedTemporaryFile(delete=True)  # temp file opened for writing

        for line in lines:           # process each line
          if line == oldline:        # find the line we want 
            tmpfile.write(newline)   # replace it 
            replaced = True  
          else:
            tmpfile.write(oldline)   # write old line unchanged

        if replaced:                   # overwrite the original file     
          f.seek(0)                    # beginning of file
          f.truncate()                 # empties out original file

          for tmplines in tmpfile: 
            f.write(tmplines)          # writes each line to original file
          written = True  

      tmpfile.close()              # tmpfile auto deleted    
      f.close()                          # we opened it , we close it 

  except IOError, ioe:                 # if something bad happened.
    printf ("ERROR" , ioe)
    f.close()                        
    return False

  return replaced and written        # replacement happened with no errors = True 

(注意:这只替换整行,以及文件中匹配的所有行)

首先,你想写一行,不管它是否与模式匹配。否则,你只能写出匹配的行。

其次,在读取行和写入结果之间,您需要截断文件(可以f.seek(0),然后f.truncate()),或者关闭原始文件并重新打开。选择前者,我会得到如下结果:

fpath = os.path.join(thisdir, filename)
with open(fpath, 'r+') as f:
    lines = f.readlines()
    f.seek(0)
    f.truncate()
    for line in lines:
        if '<a href="' in line:
            for test in filelist:
                pathmatch = file_match(line, test)
                    if pathmatch is not None: 
                        repstring = filelist[test] + pathmatch
                        line = line.replace(test, repstring)
        f.write(line)

相关问题 更多 >