【问题标题】:Replace a character by another in a file用文件中的另一个字符替换一个字符
【发布时间】:2013-06-26 11:18:17
【问题描述】:

我想就地修改文件的某些字符,而不必将文件的全部内容复制到另一个文件中,或覆盖现有的内容。但是,似乎不可能只用另一个字符替换一个字符:

>>> f = open("foo", "a+")  # file does not exist
>>> f.write("a")
1
>>> f.seek(0)
0
>>> f.write("b")
1
>>> f.seek(0)
0
>>> f.read()
'ab'

在这里,我希望将“a”替换为“b”,这样文件的内容就只是“b”,但事实并非如此。有没有办法做到这一点?

【问题讨论】:

  • 答案需要纯python吗?你愿意使用系统命令吗?
  • @screenmutt:我更喜欢 Python 方式,但如果在 Python 中无法做到这一点,是的,我愿意使用系统命令来做到这一点。

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


【解决方案1】:

那是因为你使用的模式,在追加模式下,文件指针移动到write之前的文件末尾,你应该在w+模式下打开你的文件:

f = open("foo", "w+")  # file does not exist
f.write("samething")
f.seek(1)
f.write("o")
f.seek(0)
print f.read() # prints "something"

如果您想对现有文件执行此操作而不截断它,您应该以r+ 模式打开它以进行读写。

【讨论】:

  • 其实文件不会是空的,我也不想覆盖。
  • 是的,事实上你应该使用 r+ 来打开它读/写而不是截断
【解决方案2】:

首先使用file.truncate 截断文件:

>>> f = open("foo", "a+") 
>>> f.write('a')
>>> f.truncate(0)  #truncates the file to 0 bytes
>>> f.write('b')
>>> f.seek(0)
>>> f.read()
'b'

否则按照@Guillaume 的建议以w+mode 打开文件。

【讨论】:

  • 这实际上删除了文件的内容。
  • 在追加模式下覆盖的唯一方法@doukremt
【解决方案3】:
import fileinput

for line in fileinput.input('abc', inplace=True):
    line = line.replace('t', 'ed')
    print line,

这不会逐个字符地替换,而是扫描每一行替换所需的字符并写入修改后的行。

例如: 文件“abc”包含:

i want 
to replace
character

执行后,输出为:

i waned
edo replace
characeder

它会帮助你吗?希望如此..

【讨论】:

    【解决方案4】:

    我相信您可以从这个答案中修改示例。

    https://stackoverflow.com/a/290494/1669208

    import fileinput
    
    for line in fileinput.input("test.txt", inplace=True):
        print line.replace(char1, char2),
    

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 2020-02-08
      • 2021-06-15
      • 2018-05-19
      • 2011-07-01
      • 2011-08-21
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多