交换文件的特定行

时间:2016-10-11 17:49:36

标签: python file python-3.x

我不知道这对我们中间的技术人员来说是否应该是显而易见的,但是有一种特定的方法可以从文本文件中读取一行,然后编辑它并将其插回到文件中原来的位置?我查看了网站,但我找到的所有解决方案似乎都适用于python 2.7。

以下是我正在寻找的一个例子:

    with open example.txt as file:
           for line in file: 
                 if myline in file:
                     file.edit("foo","fah")

2 个答案:

答案 0 :(得分:1)

在95%的情况下,替换文件中的数据(例如文本)通常意味着

  1. 以块的形式阅读文件,例如线由行
  2. 编辑块
  3. 将已编辑的块写入新文件
  4. 用新文件替换旧文件。
  5. 因此,一个简单的代码将是:

    import os
    
    with open(in_path, 'r') as fin:
        with open(temp_path, 'w') as fout:
            for line in fin:
                line.replace('foo', 'fah')
                fout.write(line)
    
    os.rename(temp_path, in_path)
    

    为什么不进行就地替换?好吧,文件是固定的字节序列,增长它的唯一方法是附加到文件末尾。现在,如果要替换相同长度的数据 - 没有问题。但是,如果原始序列和新序列的长度不同,则会出现问题:新序列将覆盖以下字符。例如。

    original: abc hello abc world
    replace abc -> 12345
    result: 12345ello 12345orld
    

答案 1 :(得分:0)

您可以使用cmake_minimum_required(VERSION 3.0.2) project(TestGamma) set(GAMMATEST_VERSION_MAJOR 1) set(GAMMATEST_VERSION_MINOR 0) set(CMPH_INCLUDE_DIR /usr/local/lib) include(FindPkgConfig) configure_file( "${PROJECT_SOURCE_DIR}/TestGammaConfig.h.in" "${PROJECT_BINARY_DIR}/TestGammaConfig.h" ) include_directories(${PROJECT_BINARY_DIR}) set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -std=c++11") set(SOURCE_FILES main.cpp) add_executable(testgamma ${SOURCE_FILES}) pkg_check_modules(CMPH REQUIRED cmph) include_directories(${CMPH_INDLUDE_DIR}) link_directories(${CMPH_INCLUDE_DIR}) target_link_libraries(testgamma cmph ${CMPH_INCLUDE_DIR}) fileinput来完成此操作。您仍然无法进行单行编辑,您可以有条件地更改所需的行,并将其他所有内容保留原样。

简而言之,文件如下:

inplace

你可以这样做:

$ head example.txt
pass
pass
foo
pass

结果:

import fileinput

with fileinput.input('example.txt', inplace=True) as f:
    for line in f:
        print('fah' if 'foo' in line else line.strip())