0

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

这是我的代码:

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 的示例文件,其中包含由空格分隔的两列键/值对,它可以正常工作。例如,

抗体

光盘

英夫

产生一个像这样的列表:

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

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

甲:乙

光盘

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 文件有效,而对第二个文件无效?提前感谢您的帮助。

4

5 回答 5

4

原始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)

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

于 2012-05-10T22:06:29.240 回答
2

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

dictionary = Ordereddict(l.strip().split(':') for l in f)
于 2012-05-10T22:11:13.817 回答
0

如果您自己创建输入文件,我相信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)
于 2012-05-10T21:56:29.157 回答
0

您是否尝试过打印 的内容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]))
于 2012-05-10T21:57:56.357 回答
0

如果您希望您的代码是分隔符中性的,即a:b,a-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) 
于 2016-04-04T16:49:10.900 回答