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.pswp.cn/news/396660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396660.shtml
英文地址,請注明出處:http://en.pswp.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 社區,吉多范羅…