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提供一个项目。