Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本文件检索变量值的最佳方法?_Python_Variables_Text Files - Fatal编程技术网

Python 从文本文件检索变量值的最佳方法?

Python 从文本文件检索变量值的最佳方法?,python,variables,text-files,Python,Variables,Text Files,说到这里,我有一个类似的问题,但不是相同的问题 在路上,我会有一些文本文件,结构如下: var_a: 'home' var_b: 'car' var_c: 15.5 我需要python读取该文件,然后创建一个名为var_a、值为“home”的变量,依此类推 例如: #python stuff over here getVarFromFile(filename) #this is the function that im looking for print var_b #output: car,

说到这里,我有一个类似的问题,但不是相同的问题

在路上,我会有一些文本文件,结构如下:

var_a: 'home'
var_b: 'car'
var_c: 15.5
我需要python读取该文件,然后创建一个名为var_a、值为“home”的变量,依此类推

例如:

#python stuff over here
getVarFromFile(filename) #this is the function that im looking for
print var_b
#output: car, as string
print var_c
#output 15.5, as number.
// mydata.txt
var1 = 'hi'
var2 = 'how are you?'
var3 = { 1:'elem1', 2:'elem2' }
//...

// In your script file
def getVarFromFile(filename):
    import imp
    f = open(filename)
    global data
    data = imp.load_source('data', '', f)
    f.close()

# path to "config" file
getVarFromFile('c:/mydata.txt')
print data.var1
print data.var2
print data.var3
...
这是否可能,我的意思是,甚至保留var类型

请注意,我对文本文件结构有完全的自由,如果我提出的格式不是最好的,我可以使用我喜欢的格式

编辑:ConfigParser可以是一个解决方案,但我不太喜欢它,因为在我的脚本中,我必须使用

config.get("set", "var_name")
但是我喜欢直接引用变量,就像我在python脚本中声明的那样

有没有一种方法可以将文件作为python字典导入

哦,最后一件事,请记住,我不知道文本文件中有多少变量

编辑2:我对stephan的JSON解决方案非常感兴趣,因为通过这种方式,文本文件可以简单地用其他语言(例如PHP,然后通过AJAX JavaScript)读取,但我在执行该解决方案时失败了:

#for the example, i dont load the file but create a var with the supposed file content
file_content = "'var_a': 4, 'var_b': 'a string'"
mydict = dict(file_content)
#Error: ValueError: dictionary update sequence element #0 has length 1; 2 is required
file_content_2 = "{'var_a': 4, 'var_b': 'a string'}"
mydict_2 = dict(json.dump(file_content_2, True))
#Error:
#Traceback (most recent call last):
#File "<pyshell#5>", line 1, in <module>
#mydict_2 = dict(json.dump(file_content_2, True))
#File "C:\Python26\lib\json\__init__.py", line 181, in dump
#fp.write(chunk)
#AttributeError: 'bool' object has no attribute 'write'
#例如,我不加载文件,而是使用假定的文件内容创建一个var
file_content=“'var_a':4,'var_b':'a string'”
mydict=dict(文件内容)
#错误:ValueError:字典更新序列元素#0的长度为1;2是必需的
file_content_2=“{'var_a':4'var_b':'a string'}”
mydict_2=dict(json.dump(file_content_2,True))
#错误:
#回溯(最近一次呼叫最后一次):
#文件“”,第1行,在
#mydict_2=dict(json.dump(file_content_2,True))
#文件“C:\Python26\lib\json\\ uuuuu init\uuuuuu.py”,第181行,位于转储文件中
#fp.write(块)
#AttributeError:“bool”对象没有属性“write”
JSON格式会导致什么样的问题? 还有,如何读取文本文件中的JSON数组,并将其转换为python dict

附言:我不喜欢使用.py文件的解决方案;我更喜欢.txt、.inc.。任何不受一种语言限制的文件。

您可以将文本文件视为python模块,并使用以下命令动态加载它:

例如:

#python stuff over here
getVarFromFile(filename) #this is the function that im looking for
print var_b
#output: car, as string
print var_c
#output 15.5, as number.
// mydata.txt
var1 = 'hi'
var2 = 'how are you?'
var3 = { 1:'elem1', 2:'elem2' }
//...

// In your script file
def getVarFromFile(filename):
    import imp
    f = open(filename)
    global data
    data = imp.load_source('data', '', f)
    f.close()

# path to "config" file
getVarFromFile('c:/mydata.txt')
print data.var1
print data.var2
print data.var3
...
使用ConfigParser

您的配置:

[myvars]
var_a: 'home'
var_b: 'car'
var_c: 15.5
您的python代码:

import ConfigParser

config = ConfigParser.ConfigParser()
config.read("config.ini")
var_a = config.get("myvars", "var_a")
var_b = config.get("myvars", "var_b")
var_c = config.get("myvars", "var_c")
使用字典
globals().update(字典)
将文件加载到字典中(此步骤请参阅doc for JSON或PyYAML,两者都可以存储数据类型)并将字典添加到globals字典中

如果您希望将其放在本地词典中(例如,在函数中),可以这样做:

for (n, v) in the_dict.items():
    exec('%s=%s' % (n, repr(v)))
只要安全使用
exec
。如果没有,你可以直接使用字典

但是我喜欢引用变量direclty,正如我在python脚本中声明的那样

假设您愿意稍微更改语法,只需使用python并导入“config”模块

那就做吧

from myconfig import *

您可以在当前上下文中按名称引用它们。

您想要的似乎是以下内容,但不建议这样做:

>>> for line in open('dangerous.txt'):
...     exec('%s = %s' % tuple(line.split(':', 1)))
... 
>>> var_a
'home'
这会产生一些类似于PHP的行为,因此存在相同的安全问题。此外,我展示的
exec
的使用允许任意代码执行。仅当您绝对确定文本文件的内容在任何情况下都可以信任时,才使用此选项

您应该考虑将变量绑定到局部范围,而不是绑定到对象,使用一个解析文件内容的库,这样就不执行代码。所以:使用这里提供的任何其他解决方案


(请注意:我添加此答案不是作为解决方案,而是作为明确的非解决方案。)

您的格式有多可靠?如果分隔符始终恰好为“:”,则以下操作有效。如果不是,一个相对简单的正则表达式就可以完成这项工作

只要您使用相当简单的变量类型,Python的eval函数就可以让将变量持久化到文件中变得异常简单

(下面给你一本字典,顺便说一句,你提到的是你喜欢的解决方案之一)


假设您有一个名为“test.txt”的文件,其中包含:

您想找到一个变量(a、b、c、d或e):


此处发布的其他解决方案不适用于我,因为:

  • 我只是需要一个普通脚本文件中的参数
  • import*
    对我不起作用,因为我需要一种方法通过选择另一个文件来覆盖它们
  • 仅仅是一个带有dict的文件是不好的,因为我需要在其中添加注释
因此,我最终使用了
Configparser
globals().update()

测试文件:

#File parametertest.cfg:
[Settings]
#Comments are no Problem
test= True
bla= False    #Here neither

#that neither
这是我的演示脚本:

import ConfigParser

cfg = ConfigParser.RawConfigParser()
cfg.read('parametertest.cfg')       # Read file

#print cfg.getboolean('Settings','bla') # Manual Way to acess them

par=dict(cfg.items("Settings"))
for p in par:
    par[p]=par[p].split("#",1)[0].strip() # To get rid of inline comments

globals().update(par)  #Make them availible globally

print bla
现在只需要一个有一个部分的文件,但这很容易采用


希望它能对某人有所帮助:)

如果要加载或删除文件,hbn的答案将无法开箱即用

在这种情况下,你可以考虑这个备选方案:

exec open(myconfig.py).read()
或者python3中更简单但不推荐使用的:

execfile(myconfig.py)

不过,我想Stephan202的警告适用于这两个选项,也许行上循环更安全。

如果数据具有规则结构,则可以逐行读取文件并填充您最喜欢的容器。例如:

假设你的数据有3个变量:x,y,i

一个文件包含n个这样的数据,每个变量在它自己的行上(每个记录3行)。以下是两条记录:

384
198
0
255
444
2
以下是如何将文件数据读入列表。(从文本中读取,因此相应地进行转换。)


使用标准库从文本文件读取变量的简单方法:

# Get vars from conf file
var = {}
with open("myvars.txt") as conf:
        for line in conf:
                if ":" in line:
                        name, value = line.split(":")
                        var[name] = str(value).rstrip()
globals().update(var)
默认情况下,这会将每个变量读取为字符串。如果需要将它们转换为文字变量(例如list/tuples/bool),则需要使用ast模块:

import ast
ast.literal_eval(varname)

没有任何导入模块,您无法管理。。。您可以只使用sys模块进行管理,但它不会像其他解决方案建议的那样好:)关于您的Edit2:您想要_dict=j
384
198
0
255
444
2
data = []
try:
    with open(dataFilename, "r") as file:
        # read data until end of file
        x = file.readline()
        while x != "":
            x = int(x.strip())    # remove \n, cast as int

            y = file.readline()
            y = int(y.strip())

            i = file.readline()
            i = int(i.strip())

            data.append([x,y,i])

            x = file.readline()

except FileNotFoundError as e:
    print("File not found:", e)

return(data)
# Get vars from conf file
var = {}
with open("myvars.txt") as conf:
        for line in conf:
                if ":" in line:
                        name, value = line.split(":")
                        var[name] = str(value).rstrip()
globals().update(var)
import ast
ast.literal_eval(varname)