【问题标题】:Python: Need help creating dictionaries from text files and splitting a listPython:需要帮助从文本文件创建字典和拆分列表
【发布时间】:2012-05-10 21:50:24
【问题描述】:

我想将数据保存在文本文件中,并从这些文件中创建字典,稍后将其传递给函数。

这是我的代码:

def lesson_dictionary(filename):
    print "Reading file ", filename
    with open(filename) as f:
        mylist = f.read().strip().split() 
        dictionary = OrderedDict(zip(mylist[::2], mylist[1::2])) #keep keys/values in same order as declared in mylist
        print dictionary
    return dictionary

使用名为 sample.txt 的示例文件,其中包含由空格分隔的两列键/值对,它可以正常工作。例如,

a b

c d

e f

产生一个像这样的列表:

OrderedDict([('a', 'b'), ('c', 'd'), ('e', 'f')])

但是,如果我更改 .txt 文件的代码和内容,它就会中断。例如,如果包含 sample2.txt:

a:b

c:d

e:f

我的代码是

def lesson_dictionary(filename):
    print "Reading file ", filename
    with open(filename) as f:
        mylist = f.read().strip().split(':') #CHANGED: split string at colon!
        dictionary = OrderedDict(zip(mylist[::2], mylist[1::2]))
        print dictionary
    return dictionary

我得到以下输出:

OrderedDict([('a', 'b \nc'), ('d\ne', 'f')])

发生了什么事?为什么 strip() 对第一个 .txt 文件有效,而对第二个文件无效?提前感谢您的帮助。

【问题讨论】:

    标签: python file list dictionary


    【解决方案1】:

    原来的split() 在空格上分割,\n 被认为是空格。通过更改为split(':'),您已经删除了行尾的拆分,因此一行的结尾与下一行的开头合并,中间有一个额外的换行符。除了一次读取一行文件之外,我认为没有一种简单的方法可以修复它。

    编辑:要演示的一些代码。

    dictionary = OrderedDict()
    with open(filename) as f:
        for line in f:
            key, value = line.split(':')
            dictionary[key.strip()] = value.strip()
    

    或更多本着你原作的精神:

    with open(filename) as f:
        mylist = [line.strip().split(':') for line in f]
        dictionary = OrderedDict(mylist)
    

    第二种形式的缺点是不能自动去除单词周围的空格。根据您的示例,您可能需要它。

    【讨论】:

    • 我真的会推荐替代标记建议“......除了一次读取一行文件。”让文件对象拆分行,例如for line in f 会更易读。
    • 也感谢您的意见,@Leovt。
    • 这很完美!非常感谢您的解释和示例代码,马克。
    【解决方案2】:

    split() 没有分隔符会在空白处拆分,即换行符和制表符/空格。当您在冒号上split 时,该算法不再适用,因此换行符会显示在您的输出中。试试:

    dictionary = Ordereddict(l.strip().split(':') for l in f)
    

    【讨论】:

    • 非常感谢@spinlok 的解释。您的示例代码有效并且非常有用。它也简单明了。与 Mark 的做法相比,在一条线上做这件事有优势吗?
    • @user1186742,这样做会占用一半的内存,因为你不会一次创建一个列表,你会得到一个生成器,它一次为 OrderedDict 提供一个项目。
    【解决方案3】:

    如果您自己创建输入文件,我相信json 会更适合这个问题。

    你可以这样使用它:

    import json
    
    #write the dictionary to a file
    outfile = open(filename, 'w')
    json.dump(someDictionary, outfile)
    
    #read the data back in
    with open(filename) as infile:
        newDictionary = json.load(infile)
    

    【讨论】:

      【解决方案4】:

      您是否尝试过打印出myList 的内容?

      myList = ["a", "b c", "d e", "f"]
      

      如果您希望冒号的行为相同,请先将冒号替换为空格:

      myList = f.read().replace(":", "").split()
      

      或者,如果您想将它们拆分为键值对,只需使用字符串切片将偶数和奇数元素压缩在一起:

      s = f.read().split()
      myDict = dict(zip(s[::2], s[1::2]))
      

      【讨论】:

        【解决方案5】:

        如果您希望您的代码是分隔符中性,即a:ba-ba#b 等。而不是常规的split() 使用re.split()

        import re
        pattern = re.compile(r"[^\w]")     # non-w char
        with open(filename, "rt") as fr:
            return OrderedDict(pattern.split(l.strip()) for l in fr) 
        

        【讨论】:

          猜你喜欢
          • 2018-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多