python变量输出到文件_使用函数将多个变量写入文件

首先,要获得当前正在执行的脚本名,或者更确切地说是调用函数的模块,必须从堆栈跟踪中获取它。globals()-它将在writeToValues()函数的相同上下文中执行,因此它不会从“调用者”接收globals()。要纠正这种情况,您可以使用inspect模块:import inspect

import os

def writeToValues(name):

caller = inspect.getmodule(inspect.stack()[1][0])

caller_globals = caller.__dict__ # use this instead of globals()

fileName = os.path.splitext(os.path.basename(caller.__file__))[0]

# etc.

这将确保您获得导入脚本并在其中调用writeToValues()的模块的名称。在

请记住,如果您打算编写可用的Python文件,这是一个非常糟糕的主意-如果您的脚本名有空格(如您的示例中所示),它将写入一个带有空格的变量名,如果您试图将生成的文件加载到Python解释器中,这将进一步导致语法错误。在

第二,为什么在所有事物的名字fluffy你试图做一个反向查找来找到一个变量名?您知道:

^{pr2}$

将写入{"ab": 2},而不是{}使其在意图(保存错误的变量)和状态表示(保存错误的值)中都不正确,对吗?您应该传递一个要存储/更新的变量名称,以确保获取正确的属性。在

更新部分的问题更大——您需要更新文件,而不仅仅是附加到文件中。这意味着您需要找到当前脚本的行,将其删除,然后在其位置编写一个同名的新dict。如果您不希望您的文件增长到很大的比例(也就是说,您可以将其部分保存在工作内存中),您可以使用以下方法来实现:import os

import inspect

def writeToValues(name):

caller = inspect.getmodule(inspect.stack()[1][0])

caller_globals = caller.__dict__ # use this instead of globals()

caller_name = os.path.splitext(os.path.basename(caller.__file__))[0]

# keep 'mydict' list in the caller space so multiple callers can use this

target_dict = caller_globals['mydict'] = caller_globals.get('mydict', {})

if name not in caller_globals: # the updated value no longer exists, remove it

target_dict.pop(name, None)

else:

target_dict[name] = caller_globals[name]

# update the 'values.py':

# optionaly check if you should update - if values didn't change no need for slow I/O

with open("values.py", "a+") as f:

last_pos = 0 # keep the last non-update position

while True:

line = f.readline() # we need to use readline() for tell() accuracy

if not line or line.startswith(caller_name): # break at the matching line or EOF

break

last_pos = f.tell() # new non-update position

append_data = f.readlines() # store in memory the rest of the file content, if any

f.seek(last_pos) # rewind to the last non-update position

f.truncate() # truncate the rest of the file

f.write("".join((caller_name, " = ", str(target_dict), "\n"))) # write updated dict

if append_data: # write back the rest of the file, if truncated

f.writelines(append_data)

return target_dict

否则,使用临时文件在读取时写入所有内容,除了与当前脚本匹配的行外,为当前脚本附加新值,删除原始值并将临时文件重命名为values.py。在

所以现在,如果您将上述内容存储在value_writter.py中,并在脚本my_script.py中使用它:import value_writter

a = 2

b = 3

value_writter.write_to_values("a")

value_writter.write_to_values("b")

a = 5

value_writter.write_to_values("a")

# values.py contains: my_script = {"a": 5, "b": 3}

对于您导入到的任何脚本也应该如此。现在,让多个脚本在没有锁定机制的情况下编辑同一个文件是一个等待发生的意外,但那是另一回事。在

此外,如果您的值很复杂,系统将中断(或者更确切地说,您的dict打印输出看起来不太合适)。帮你自己一个忙,使用一些适当的序列化,甚至可怕的pickle也比这更好。在

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式linux系统移植的四大步骤_嵌入式系统移植步骤

在嵌入式系统移植中重要的一部分是操作系统的移植,与其它操作系统相比,Linux大的特点:它是一款遵循GPL的操作系统,我们可以自由地使用、修改、和扩展它。正是由于这一特色,嵌入式系统移植过程中Linux系统受到越来越多人…

sdn框架的计算机网络管理,清华SDN实践--SDN 系统架构与数据中心应用

清华大学在SDN 的系统架构以及其在数据中心网络中的应用方面展开了深入研究,主要研究成果包括:1. 以数据为中心的软件定义网络架构 SODA(Software Defined Data Centric Networking)。与 OpenFlow 相比,SODA 大大增强了数据层面的处理能力&am…

《软件工程》课之-调查问卷的心得体会

1.这次调查是艰辛的。 2.很多人都误以为我在发小广告。。 3.很多人都不认识俄罗斯方块1010这个游戏。 4.大家对于游戏的见解千奇百怪。 5.题目出的不是很完美,下次改进。。 6.简单分析下结果,男孩子都喜欢多人的游戏,女孩的喜欢的多种多样&am…

python循环语句for求和_for循环简介

## for循环简介for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结构如下:![](https://img.kancloud.cn/75/33/753371a9536ed9eeb159074482ec85f0_558x174.png)说明&…

华为备份历史版本_华为手机NAS备份时提示“需处于同一局域网”的解决方法

本内容来源于什么值得买APP,观点仅代表作者本人 |作者:噩梦飘雷创作立场声明:在使用华为手机向群晖NAS中备份时发现一直无法成功,经过一番研究找到了解决方案,希望能帮到大家~前言最近看了一位老哥的帖子&a…

计算机系统集成难点,企业MES实施中存在的难点及建议

MES是企业生产管理服务的核心信息化系统。实施MES是为了将现代企业生产管理思想、理念引入企业生产管理,对企业生产管理流程进行重组和优化,促进企业生产管理水平的提高。可是作用如此大的MES系统在实施过程中能一路无阻吗?MES系统的作用1.车…

【原创】自己编写的JavaGUI一键生成(hibernate/spring/mvc/maven)工具(附带视频教程源码)...

为什么80%的码农都做不了架构师?>>> 带项目源码(https://git.oschina.net/qsyan/GeneratorFx) app下载地址(附带视频教程):http://download.csdn.net/detail/juyan2008/9769406 注明:此应用采用javafx编写…

2018-2019 20165203 《信息安全系统设计基础》第一周学习总结

2018-2019-1 20165203 《信息安全系统设计基础》第一周学习总结 教材学习内容总结 编译:gcc [选项] [文件名]选项参数表 参数对应功能-E仅执行编译预处理-S将.c代码转换为汇编语言代码-c仅执行编译操作,不进行连接操作-o指定生成的输出文件-I (大写)指定…

普通计算机怎么算根号_大学专业介绍 | 计算机专业的真实就业情况

前两天给大家简单介绍了近些年比较火的计算机类相关专业具体都有哪些不同,以及就业时的行业或者岗位的侧重点。今天呢我们继续这个话题,来聊一聊整个计算机相关专业在学习和就业过程中大概是什么样子的,希望能够给大家提供一些实实在在的参考…

设计模式总结篇系列:工厂方法模式(Factory Method)

工厂方法模式适合于对实现了同一接口或继承了同一父类的一些类进行实例的创建。一般是通过定义一个工厂类,并在其方法中实现对具有上述特点的类对象的创建。 根据具体产生类对象的方法定义形式,又可以将其分为普通工厂方法模式、多个工厂方法模式和静态工…

高新园区到大连计算机学校,大连高新区中心小学

大连市高新区中心小学简介:大连市高新区中心小学始建于2009年9月,是大连高新技术产业园区筹建的第一所直属公办学校。学校现拥有2000多名学生,87名教职员工。学校确定了“办诗韵教育,让每个孩子都幸福的教育理念”,通过…

java基础之匿名内部类

内部类:   概述: 类里边还有一个类, 里边那个类叫内部类, 外边那个类叫外部类.   分类:  成员内部类: 定义在成员位置的内部类.  局部内部类: 定义在局部位置的内部类. 格式:   new 类名或者接口名(){     //重写类或者接口中 所有的 抽象方法;   };本质:  就…

0限流电阻 stm32_上/下拉电阻

除了前一节讨论的拉电阻基本使用方法外,上拉电阻也可以提升高电平的电压阈值,以便于前后级信号相匹配,比如,TTL逻辑电平驱动CMOS逻辑电平时,我们通常会添加一个上拉电阻R1,如下图所示:But Why&a…

天地与我并存/万物与我为一 2

http://blog.sina.com.cn/s/blog_17e792e010102y4lu.html 庖丁解牛 先秦:庄周 吾生也有涯,而知也无涯 。以有涯随无涯,殆已!已而为知者,殆而已矣!为善无近名,为恶无近刑。缘督以为经&#xff0c…

网段和子网的区别_电焊石笼网与普通石笼网区别

对于石笼网,每个人都会想到在河中,桥梁附近和大坝上充满石头的笼子结构。今天,我们谈论的是石笼网的一种电焊石笼网,它也是一种常见的石笼网,也被称为六边形石笼网。其功能与石笼网相同,但用法与普通石笼网…

jquery $(document).ready() 与window.onload的区别

转载博客:http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的。 1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后…

小学三年级上册计算机计划,小学三年级数学上册教学计划

小学三年级数学上册教学计划一、班级情况分析这一学期我继续担任三年级数学教学工作,本班现有学生9人,其中男生3人,女生6人。三年级学生已经有两年的数学学习经历,对一些基础性的数学知识有了初步的认识。学生已经比较习惯于新教材…

centos7查看当前cpu运行模式_杂集:centos7中设置服务开机自启的两种方法,欢迎补充...

前言:在日常使用linux系统过程中,安装服务后系统不会自动启动服务的。就算手动启动了服务,只是当前生效,一旦服务器重启后,系统不会自动启动这些服务。如果每次重启服务器都要自己手动启动这些服务,一台还阔…

Sort HDU5884(二分+多叉哈夫曼树)

HDU5884 Sort 题意:有n个序列要进行归并,每次归并的代价是两个序列的长度的和,要求最终的代价不能超过规定的T,求在此前提下一次能同时进行归并的序列的个数k。 思路:还是太单纯,看完题目一直以为要用归并排…

python来源是什么_python起源?为什么使用python?直至爱上python的五个理由

原标题:python起源?为什么使用python?直至爱上python的五个理由Python的创始人,吉多范罗苏姆,是一名荷兰计算机程序员,他作为 Python 程序设计语言的作者而为人们熟知。在 Python 社区,吉多范罗…