2
回答
python 读取txt文件 替换指定内容 求大神指导指导

E盘下有test.txt文件

内容例如为:

-----------------------------------
名称:    {name}
编号:    {id}

-----------------------------------

现在通过python读取后,根据一个字典形如{‘name’:'张san','id':'12345'}

 {name}、{id}等替换成对应的值,不存在则为‘无’字典和文件内容都是未知),然后重新得到test.txt文件的内容

因为之前一直是搞java java是会得 也得到想要的结果,初学python 球大神指教下

java:

                String ts = new String(bs, "utf-8");//ts为文件内容
                List<String> ls = new ArrayList<String>();
                String[] strs = ts.toString().split("\\{");
                for (int i = 1; i < strs.length; i++) {
                    ls.add(strs[i].split("\\}")[0]);
                }

            dict//为一个map类似于python里面的字典
                for (int j = 0; j < ls.size(); j++) {
                    if (dict.containsKey(ls.get(j))) {
                        if (dict.get(ls.get(j)) != null) {
                            ts = ts.replace("{" + ls.get(j) + "}", dict.get(ls.get(j)).toString());
                        } else {
                            ts = ts.replace("{" + ls.get(j) + "}", "无");
                        }
                    }
                }
python:

f = open('E:\\test.txt', "r")

content = f.read()

通过java逻辑没成功

举报
yy670010378
发帖于2年前 2回/781阅
共有2个答案 最后回答: 2年前
class mydict(dict):
    def __getitem__(self, name):
        value=self.get(name)
        return value or '无'


with open('E:\\test.txt', "r") as f:
    content = f.read()


d= mydict()
d['name']='aaa'
d['id']='123'
s=content.format(**d)


with open('E:\\test_result.txt','w') as f:
  f.write(s)

上面的方法在python3.5下正常,但在python2.7下还会报错问题,最后在statckoverflow找到方法了,源贴地址:http://stackoverflow.com/questions/20248355/how-to-get-python-to-gracefully-format-none-and-non-existing-fields

用它的办法改进后如下(我这试2.7下也没问题了):

import string

class PartialFormatter(string.Formatter):
    def __init__(self, missing='无', bad_fmt='!!'):
        self.missing, self.bad_fmt=missing, bad_fmt

    def get_field(self, field_name, args, kwargs):
        # Handle a key not found
        try:
            val=super(PartialFormatter, self).get_field(field_name, args, kwargs)
            # Python 3, 'super().get_field(field_name, args, kwargs)' works
        except (KeyError, AttributeError):
            val=None,field_name
        return val

    def format_field(self, value, spec):
        # handle an invalid format
        if value==None: return self.missing
        try:
            return super(PartialFormatter, self).format_field(value, spec)
        except ValueError:
            if self.bad_fmt is not None: return self.bad_fmt
            else: raise



with open('E:\\test.txt', "r") as f:
    content = f.read()
 
d= {}
d['name']='aaa'
#d['id']='123'

fmt=PartialFormatter()
s=fmt.format(content,**d)
 
with open('E:\\test_result.txt','w') as f:
  f.write(s)



--- 共有 13 条评论 ---
yy670010378回复 @wei2011 : 恩 学习了 万分感谢 2年前 回复
wei2011回复 @yy670010378 : 在statckoverflow找到办法了。贴上了,你试一下 2年前 回复
yy670010378回复 @wei2011 : 恩 麻烦了哈 我也找找原因 2年前 回复
wei2011回复 @yy670010378 : 呃,我在2.7下试的确有问题,不过思路应该是对的,应该是2.7下dict的字典的__getitem__有点不一样。。。我再试试 2年前 回复
yy670010378回复 @wei2011 : 是啊 代码全部贴过去的 2年前 回复
顶部