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

スペースで区切られたキーと値のペアの 2 つの列を含む sample.txt という名前のサンプル ファイルを使用すると、問題なく動作します。例えば、

ab

CD

エフ

次のようなリストが得られます。

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

しかし、コードと .txt ファイルの内容を変更すると、壊れます。たとえば、sample2.txt に次のものが含まれているとします。

a:b

CD

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 ファイルでは機能するのに、2 番目のファイルでは機能しないのはなぜですか? 助けてくれてありがとう。

4

5 に答える 5

4

split()は空白で分割され、空白と\n見なされます。に変更するsplit(':')ことで、行末の分割が削除されたため、1 つの行の終わりが次の行の始まりとマージされ、途中に余分な改行文字が追加されます。ファイルを一度に 1 行ずつ読み取る以外に、簡単に修正する方法はないと思います。

編集:デモンストレーションするコード。

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)

2 番目の形式には、単語の周囲から空白が自動的に削除されないという欠点があります。あなたの例に基づいて、それが必要になるかもしれません。

于 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

コードをdelimiter Neutral、つまりa:b,などa-bにしたい場合a#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 に答える
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

入力ファイルを自分で作成している場合は、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 に答える