【问题标题】:How do i parse .txt file contents with txt and ids to a dictionary in python?如何将带有txt和ids的.txt文件内容解析为python中的字典?
【发布时间】:2018-08-01 22:38:23
【问题描述】:

以下是文本文件内容,文本数据没有标题或引号。我如何在字典中解析这些。我文件中的每条记录都在一个新行下面是我的文本文件内容:

B00308CJ12 Bulletproof Salesman (2008)
189138922X Classical Mechanics
B0000CEP9J Fiesta Black 464 7-1/4-inch Salad Plate
B000HRH6IA Baby Blue Aurora Blue Gem Butterfly Belly Ring
B000002ERY Predicciones Leo

使用下面的代码会给我一个错误。我假设那是因为我的句子不在引号中。我该怎么做才能纠正这些值并将这些值放入字典中

 f = open('file_path', 'r')
    answer = {}
    for line in f:
        k, v = line.strip().split(' ')
        answer[k.strip()] = v.strip()

    f.close() 

错误:

k, v = line.strip().split(' ')

ValueError:解包的值太多(预计 2 个)

修改代码后编辑

 f = open('file_path', encoding="utf8")
    answer = {}
    for line in f:
        k, v = line.strip().split(' ')[0],line.strip().split(' ')[1:]
        answer[k] = v

    f.close()

错误:

文件“C:\ProgramData\Anaconda3\lib\codecs.py”,第 321 行,在解码中 (结果,消耗) = self._buffer_decode(data, self.errors, final)

UnicodeDecodeError: 'utf-8' 编解码器无法在位置解码字节 0xae 1266: 无效的起始字节

【问题讨论】:

  • 你打算得到{'B00308CJ12':'Bulletproof Salesman (2008)',...}吗?即,左边的每个键都是右边的完整字符串?
  • 是的,但我的代码给了我这样的东西 {'B00308CJ12':['Bulletproof', 'Salesman', '(2008)']}... 这似乎是问题所在跨度>

标签: python-3.x dictionary text


【解决方案1】:

如果你想要{'B00308CJ12':'Bulletproof Salesman (2008)',...}

试试这个:

di={}    
with open(fn) as f_in:
    for line in f_in:
        k,v=line.split(sep=None,maxsplit=1)
        di[k]=v.rstrip()

>>> di
{'B00308CJ12': 'Bulletproof Salesman (2008)', 
 '189138922X': 'Classical Mechanics', 
 'B0000CEP9J': 'Fiesta Black 464 7-1/4-inch Salad Plate', 
 'B000HRH6IA': 'Baby Blue Aurora Blue Gem Butterfly Belly Ring', 
 'B000002ERY': 'Predicciones Leo'}

【讨论】:

    【解决方案2】:

    替换

    k, v = line.strip().split(' ')
    

    k, v = line.strip().split(' ')[0],line.strip().split(' ')[1:]
    

    你的句子中有空格,所以你得到的值比你预期的要多

    【讨论】:

      【解决方案3】:

      line.strip().split(' ') 行实际上将文本文件的每一行拆分为一个列表,其中空格字符' ' 作为分隔符,为第一行['B00308CJ12', 'Bulletproof', 'Salesman', '(2008)'] 生成类似这样的输出。此时如果你想创建一个字典,你需要决定你想要什么作为字典中的键和值,并使用它们对应的索引从列表中获取这些值

      关于编码的更新

      尝试使用这一行读取文件

      f = open('file_path', encoding="utf8")
      

      要将'Bulletproof Salesman (2008)' 作为值,您可以使用连接函数

      k, v = line.strip().split(' ')[0], " ".join(line.strip().split(' ')[1:])
      

      【讨论】:

      • 是的,我做到了,它在我的文件的一半被解析为字典后抛出错误 >>> 文件“C:\ProgramData\Anaconda3\lib\encodings\cp1252.py”,第 23 行,在解码返回 codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 4062: character maps to
      • 你用什么做钥匙?您能否使用新版本的代码更新您的原始问题。否则将很难提供帮助。但这在我看来像是字符编码问题
      • 我以id为key,以句子为value。我已经用所做的更改和错误更新了原始问题
      • 正如我所料,这是一个字符编码错误。尝试读取指定编码方法的文件,如 utf-8。查看我的更新答案
      • 这引发了一个成功的错误 - 再次更新问题
      【解决方案4】:

      所有答案放在一起下面的代码就像预期的魅力一样,即 {'B00308CJ12': 'Bulletproof Salesman (2008)','189138922X': 'Classical Mechanics', ......} 谢谢大家!!

      answer = {}
      with open('filepath','rb') as f:
          for line in f:
              k, v = line.strip().split(sep=None,maxsplit=1)[0],line.strip().split(sep=None,maxsplit=1)[1:]
              answer[k] = v
      f.close()
      

      【讨论】:

      • 注:1)f.close()在使用with打开文件时不是必须的。 2)您正在使用 k, v = line.strip().split(sep=None,maxsplit=1)[0],line.strip().split(sep=None,maxsplit=1)[1:] 不必要地执行第二次拆分您可以使用 k,v=line.strip().split(maxsplit=1)kv 的元组解包将自动获得正确的值。
      • 不进行第二次拆分会给我一个错误 >>k,v=line.strip().split(maxsplit=1) ValueError: not enough values to unpack (expected 2, got 1)
      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 2018-11-07
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      相关资源
      最近更新 更多