【问题标题】:In place replacement of text in a file in Python在 Python 中就地替换文件中的文本
【发布时间】:2016-11-30 10:15:48
【问题描述】:

我正在使用以下代码在编辑后使用 FTP 将文件上传到服务器:

import fileinput

file = open('example.php','rb+')

for line in fileinput.input('example.php'):
    if 'Original' in line :
        file.write( line.replace('Original', 'Replacement'))

file.close()    

有一点,代码不是替换原处的文本,而是在末尾添加替换的文本,原处的文本不变。

此外,它不仅会打印出被替换的文本,还会打印出整行。谁能告诉我如何解决这两个错误?

【问题讨论】:

  • 既然你用的是文件输入,为什么不直接fileinput.input('example.php', inplace=True)
  • 其他行呢?
  • @PadraicCunningham 这给出了一个错误。除了使用fileinput之外还有其他方法吗?
  • 不是我知道的,在windows外的大多数系统上都应该是原子操作,我个人更喜欢tempfile方法

标签: python file python-3.x python-3.5


【解决方案1】:

1) 代码末尾添加了替换后的文字,原处的文字不变。

您无法在文件正文中进行替换,因为您使用+ 信号打开它。这样它将追加到文件的末尾。

file = open('example.php','rb+')

但这只有在您想追加到文档末尾时才有效。

绕过,您可以使用seek() 导航到特定行并替换它。或者创建 2 个文件:一个 input_file 和一个 output_file


2) 此外,它不仅会打印出被替换的文本,还会打印出整行。

那是因为你在使用:

file.write( line.replace('Original', 'Replacement'))

免费代码:

我已经分成两个文件,一个输入文件和一个输出文件。

首先它会打开ifile并将所有行保存在一个名为lines的列表中。

其次,它会读取所有这些行,如果存在'Original',它将是replace

替换后会保存到ofile

ifile = 'example.php'
ofile = 'example_edited.php'

with open(ifile, 'rb') as f:
    lines = f.readlines()

with open(ofile, 'wb') as g:
    for line in lines:
        if 'Original' in line:
            g.write(line.replace('Original', 'Replacement'))

如果你愿意,你可以os.remove()未编辑的文件:


更多信息: Tutorials Point: Python Files I/O

【讨论】:

  • 感谢 dot.Py 的回答,但有没有办法在不创建两个文件的情况下做到这一点?
  • @SanJeetSingh 在这两种情况下都使用 ifile。首先它会读取这些行,然后它会打开 example.php 输出,清除它,然后你将这些行写回,给你留下一个编辑过的文件,但如果出现任何问题,可能会导致文件被丢弃。
【解决方案2】:

第二个错误是replace() 方法的工作原理。

它返回整个输入字符串,只替换指定的子字符串。参见示例here

要写入文件中的特定位置,您应该先seek() 到正确的位置。

我想这个问题之前在很多地方都被问过,我会快速搜索一下 StackOverflow。

也许this 会有所帮助?

【讨论】:

    【解决方案3】:

    如果原始文件和替换文件具有相同的大小(以字节为单位),则替换文件中的内容效果很好,那么您可以这样做

    with open('example.php','rb+') as f:
        pos=f.tell()
        line=f.readline()
        if b'Original' in line:
            f.seek(pos)
            f.write(line.replace(b'Original',b'Replacement'))
    

    (在这种情况下,b'Original'b'Replacement' 的大小不同,因此您的文件在此之后会看起来很有趣)

    编辑:

    如果原始大小和替换大小不同,则有不同的可能性,例如添加字节以填充孔或移动行后的所有内容。

    【讨论】:

    • Replacing stuff in a file only works if original and replacement have the same size (in bytes)。您可以发布此信息的来源吗?
    • 我刚试过s = 'abc'; t = s.replace('a', 'aaa'); print t,效果很好。
    • 对于字符串,添加/删除部分没有问题,因为无论如何都会创建一个新部分,但是如果您想在文件中添加或删除一些字节,则必须在其后移动所有内容 - 这意味着读取和写入大零件的背面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多