【问题标题】:How do I dump text file contents into dictionary如何将文本文件内容转储到字典中
【发布时间】:2016-03-21 19:15:54
【问题描述】:

您好,我在 mac 上使用 python 3,我正在尝试创建一个通用程序来与一系列不同的万用表进行通信,具体取决于加载的文本文件。例如,我想要一个看起来像这样的字典:

prog_key  = {"DC_Volts":"FUNC:DC V","AC_Volts":"FUNC:AC V"...} #just an example

这最终将与 pyvisa 库结合使用,以便向仪表发送命令。

所以,为了让我的程序通用,我想要这本字典:

prog_key = {}

加载具有以下内容的文本文件:

"DC_Volt”:”FUNC:VOLT DC”,
"DC_Curr”:”FUNC:CURR DC”,
"AC_Volt”:”FUNC:VOLT AC”,
"AC_Curr”:”FUNC:CURR AC”,
"Res_2”:”FUNC:RES”,
"Res_4”:”FUNC:RES 4”,
"Freq”:”FUNC:FREQ”,
"Cap”:”FUNC:CAP”,
"Temp”:”FUNC:TEMP”,
"Diode”:”FUNC:DIO”,
“Meas”:”MEAS:IMM”

因为我将在文本文件中准备好它的格式,所以我只想将它转储到字典中(所有引号、冒号和逗号都将就位)。我这样做是因为不同的仪表会有不同的命令,所以如果我使用不同的仪表,我可以加载不同的文本文件。

我的命令有冒号这一事实会导致任何问题吗?

如果有更好的方法,我不介意重新格式化我的文本文件。主要的是我让所有的文本文件都遵循相同的趋势,只要它有效,trent 是什么并不重要!

谢谢

编辑:这些确实是直引号

【问题讨论】:

  • 那些实际上是智能引号(),还是它们真的是直引号(")?
  • 这听起来更像是类的用例而不是字典的用例。基本上,一个类是一个增强的字典。您甚至可以使用继承来处理具有某些相似性的仪表。
  • 我已经编辑过了,应该是直引号

标签: python dictionary text io visa


【解决方案1】:

我认为格式化文件的更好方法(以避免处理逗号分隔符和冒号字段分隔符)是 CSV。例如,

"DC_Volt","FUNC:VOLT DC"
"DC_Curr","FUNC:CURR DC"
"AC_Volt","FUNC:VOLT AC"

这将允许您按如下方式读入您的字典:

import csv

my_dict = {}

with open('myfile.csv', 'r') as f:
  for line in csv.reader(f):
    my_dict[line[0]] = line[1]

编辑:就像@ShadowRanger 建议的那样,这对于 JSON 可能比 CSV 更好。 (它可以让你保持你的键值格式)。

文件可能如下所示:

{
  "DC_Volt":"FUNC:VOLT DC",
  "DC_Curr":"FUNC:CURR DC",
  "AC_Volt":"FUNC:VOLT AC"
}

你的代码可能是:

import json

with open('myfile.json', 'r') as f:
  j = json.load(f)

【讨论】:

  • 实际上,如果每行正好一对会更容易:my_dict = dict(csv.reader(f)) 会这样做。无需初始化为空dict,Python 中无需显式循环。
  • 啊,漂亮的小单行!会记下那个。
  • 我一发布这个就考虑使用 csv 代替
  • @KierranPurden:Yar,csv 模块甚至不需要您更改文件格式;只需将csv.reader 配置为使用delimiter=':',可能与quoting=csv.QUOTE_ALL 一起使用(可能不需要读取),它将适用于原始文件。
  • @ShadowRanger 对此表示感谢。如果我使用冒号作为分隔符,那么它会与引号内的冒号混淆吗?抱歉,我现在不在笔记本电脑旁,所以无法尝试(移动应用)
【解决方案2】:

好吧,无需更改现有文件,因为您的键和值都是合法的 str 文字(假设那些智能引号是错误的),您可以让 Python 使用 ast.literal_evaljson.loads 完成工作:

import ast
import json

with open(myfilename) as f:
    dict_literal_str = '{{ {} }}'.format(f.read())
# With ast
prog_key = ast.literal_eval(dict_literal_str)
# or json
prog_key = json.loads(dict_literal_str)

【讨论】:

  • 为什么是双花括号?
  • @PeterWood:format 方法会将它们解释为格式项分隔符;您可以通过将大括号加倍来逃避大括号。
【解决方案3】:

这假定文件中的所有引号都是实际的",而不是其他类型的引号。它的作用是读取文件,匹配正则表达式并填充字典。

import re

dictionary = {}
file = open(FILE_NAME, "r")
for line in file:
   catched = re.findall("\"(.*)\":\"(.*)\"", line)
   # Only one result which is a tuple
   dictionary[catched[0][0]] = catched[0][1]
file.close()

【讨论】:

  • 用正则表达式重新实现基本解析?请不。 (另外,文件对象始终使用with 语句)
  • @ShadowRanger 我是喜欢重新发明轮子而不是使用当前设计的轮子的人之一。最重要的是,我认为这甚至可能会增加人们的知识。您的代码小而简单,但我不清楚它实际上做了什么。毕竟,我是初学者:P
  • 我完全赞成通过重新发明轮子来学习,但是使用正则表达式并不能真正改善这里的情况。特别是在解析已知格式时,请始终在可用时使用适当的解析器;解析的边缘情况是丑陋的,并且通常不可能或非常丑陋地用正则表达式正确处理(它们不是上下文无关的语法,或者表达得很差的上下文无关语法)。如果可能,请始终首先使用现有的解析器,如果不存在正则表达式并且格式足够简单以避免出现主要的边缘情况,则仅使用正则表达式。
猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多