【问题标题】:Overwritting characters from a file in Python在 Python 中覆盖文件中的字符
【发布时间】:2015-05-27 11:35:50
【问题描述】:

我想更改我拥有的文件中的一些文本,但我找不到使用 python 从文件中删除字符的正确方法。是否可以? 例如,我有一个看起来很像这样的文件:

Marry has 10 carrots
Bob has 15 apples
Tom has 4 bananas

现在我想更改文件中的数字,甚至是水果。 我只能读取数字,但不能删除或覆盖它们。

【问题讨论】:

  • 读取文件,解析信息,更改信息,将数据以相同格式写入文件。

标签: python


【解决方案1】:

使用fileinputinplace=True修改文件内容:

import fileinput
import sys
for line in fileinput.input("test.txt",inplace=True):
    # replaces all occurrences of apples in each line with oranges
    sys.stdout.write(line.replace("apples","oranges"))

输入:

Marry has 10 carrots
Bob has 15 apples
Tom has 4 bananas

输出:

Marry has 10 carrots
Bob has 15 oranges
Tom has 4 bananas

使用 re 避免匹配子字符串:

import fileinput
import sys
import re
# use word boundaries so we only match "apples"  
r = re.compile(r"\bapples\b")
for line in fileinput.input("test.txt",inplace=True):
    # will write the line as is or replace apples with oranges and write
    sys.stdout.write(r.sub("oranges",line))

删除所有最后的单词:

import fileinput
import sys
for line in fileinput.input("test.txt",inplace=True):
    # split on the last whitespace and write everything up to that
    sys.stdout.write("{}\n".format(line.rsplit(None, 1)[0]))

输出:

Marry has 10
Bob has 15
Tom has 4

您也可以使用tempfile.NamedTemporaryFile 将更新的行写入使用上述任何逻辑,然后使用shutil.move 替换原始文件:

from tempfile import NamedTemporaryFile
from shutil import move

with open("test.txt") as f, NamedTemporaryFile("w",dir=".", delete=False) as temp:
    for line in f:
        temp.write("{}\n".format(line.rsplit(None, 1)[0]))

# replace original file with updated content
move(temp.name,"test.txt")

你需要传递dir="."delete=False这样当我们退出with时文件文件不会被删除,我们可以访问带有.name属性的文件传递给shutil。

【讨论】:

  • 可以只删除水果吗?
  • @Singularity,你的意思是最后一句话?
  • @Singularity, re.compile("\d+")
  • @Singularity,你可以做一百万种不同的事情,你可以" ".join([word for word in line.split() if not word.startswith("B")])
  • @Padraic Cunningham,谢谢你,这正是我想要的。
猜你喜欢
  • 2015-01-20
  • 2021-01-16
  • 1970-01-01
  • 2017-06-12
  • 2013-03-07
  • 1970-01-01
  • 2021-12-07
  • 2016-07-09
相关资源
最近更新 更多