Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_File_List_Dictionary - Fatal编程技术网

Python:需要帮助从文本文件创建字典和拆分列表吗

Python:需要帮助从文本文件创建字典和拆分列表吗,python,file,list,dictionary,Python,File,List,Dictionary,我想将数据保存在文本文件中,并从这些文件中创建字典,稍后我会将其传递给函数 这是我的密码: 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]

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

这是我的密码:

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

EF

产生如下列表:

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文件而不适用于第二个?提前感谢您的帮助。

如果您自己创建输入文件,我相信它更适合解决此问题

您可以这样使用它:

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)

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

您可以这样使用它:

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)

您是否尝试打印出
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]))

您是否尝试打印出
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]))
原始的
split()
在空白处拆分,而
\n
被视为空白。通过更改为<代码>拆分(':') >您已经删除了末尾的分割,因此一行的结尾与中间的另一个新行字符合并在下一个开始处。我不认为有一个简单的方法来修复它,除了一次读取一行文件

编辑:一些代码来演示

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)
第二种形式的缺点是不能自动去除单词周围的空白。根据您的示例,您可能需要它。

原始的
split()
在空格上拆分,而
\n
被视为空格。通过更改为<代码>拆分(':') >您已经删除了末尾的分割,因此一行的结尾与中间的另一个新行字符合并在下一个开始处。我不认为有一个简单的方法来修复它,除了一次读取一行文件

编辑:一些代码来演示

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)
第二种形式的缺点是不能自动去除单词周围的空白。根据您的示例,您可能需要它。

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

dictionary = Ordereddict(l.strip().split(':') for l in f)
split()。当您在冒号上拆分
时,该算法不再适用,因此输出中将显示换行符。尝试:

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

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


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


我真的建议使用另一种方法,mark建议“…除了一次读取一行文件。”让file对象拆分行(例如,f中的行
将更具可读性。也感谢您的输入,@Leovt。这非常有效!非常感谢您的解释和示例代码,Mark。我真的建议您选择Mark建议的替代方案“……除了一次只读取一行文件。”让file对象拆分行(例如f中的行)将更具可读性。也感谢您的输入,@Leovt。这非常有效!非常感谢您的解释和示例代码,马克。非常感谢您的解释,@spinlok。您的示例代码工作正常,非常有用。它也简单明了。与Mark的做法相比,在一行上进行有什么优势吗?@user1186742,这样做会占用一半的内存,因为你不会一次创建一个列表,你会得到一个生成器,它一次为订购的信息提供一个信息。非常感谢你的解释,@spinlok。您的示例代码工作正常,非常有用。它也简单明了。与Mark的方式相比,在一行上进行有什么优势吗?@user1186742,这样做会占用一半的内存,因为你不会一次创建一个列表,你会得到一个生成器,它一次为OrderedDict提供一个项目。