2012-10-18 69 views
1

我试图运行一个python程序,该程序可以从文件中运行字典列表,每个单词赋予一个分数和标准差。我的计划是这样的:TAB break在Python字典中拆分行

theFile = open('word-happiness.csv' , 'r') 

theFile.close() 

def make_happiness_table(filename): 
    '''make_happiness_table: string -> dict 
     creates a dictionary of happiness scores from the given file''' 
    with open(filename) as f: 
     d = dict(line.split(' ') for line in f) 
    return d 

make_happiness_table("word-happiness.csv") 

table = make_happiness_table("word-happiness.csv") 
(score, stddev) = table['hunger'] 
print("the score for 'hunger' is %f" % score) 

我的.csv文件的格式为

word{TAB}score{TAB}standard_deviation 

,我试图创造这样的字典。我如何创建这样一本词典,以便我可以从函数中打印出“饥饿”这样的词,并获得它的分数和偏差?

+0

如果字段之间由TAB分隔,那么它不是真正的“CSV”(“逗号分隔值”),是吗?如果它实际上是用逗号分开的,你可以使用csvreader类来处理把csv转换成字典的过程 – mfrankli

+2

@mfrankli你可以使用csvreader读取由任何字符分隔的文件,这个选项对于那个有趣的 –

+0

啊,从来不知道那!虽然有意义(在这种情况下,这将是这个应用程序的最佳选择,我想象一下吗?) – mfrankli

回答

1
def make_happiness_table(filename): 
    with open(filename) as f: 
     d = dict() 
     for line in f: 
     word,score,std = line.split() #splits on any consecutive runs of whitspace 
     d[word]=score,std # May want to make floats: `d[word] = float(score),float(std)` 
    return d 

请注意,如果您word中可以有一个tab性格,但你保证,你只能有3个领域(文字,得分,STD),您可以从右边分割字符串(str.rsplit) ,只分裂两次(最终导致3个字段)。例如word,score,std = line.rsplit(None,2)

正如上面评论中提到的,您也可以使用csv模块来读取这些类型的文件 - csv如果您的字段可以被“引用”,那么它真的很棒。例如: -

"this is field 0" "this is field 1" "this is field 2" 

如果你没有这样的情况,然后我发现str.split作品就好了。


而且,不相关的,但你的代码调用make_happiness_table两次(第一次不分配返回值到任何东西)。第一次调用是无用的(它所做的只是读取文件并构建一个永远不会使用的字典)。最后,在你的脚本开始时,open ing和close ing theFile也只是一种浪费,因为你不对该文件做任何事情。

1

如果您确定自己的单词没有空格,则可以将该行分割

word, score, stddev = line.split() 

但是,如果字可以有空间使用标签炭\t分裂例如

word, score, stddev = line.split('\t') 

但对于一个非常通用的情况下,当字可以有标签本身使用csv模块

reader = csv.reader(filename, dialect='excel-tab') 
for word, score, stddev in reader: 
    ... 

,然后你可以创建字和分数,STDDEV例如字典的

word_dict[word] = (score, stddev) 
+0

csv如何知道将''wordstart \ twordend \ tfoo \ bar''分成只有3个字段?我假设在'通用'的情况下,你仍然需要混淆数据文件以引用'wordstart'和'wordend'。在这种情况下,为了避免需要引用数据文件,我会使用'line'。rsplit(无,2)'。当然,如果你有多个可以有制表符的字段,那么你运气不好,你需要引用数据文件并使用'csv'。 – mgilson

+0

@mgilson假设数据文件会被正确地引用,如果没有引用它,我们甚至不知道除了将它拆分为制表符之外什么是单词,csvreader可以做任何类似于程序在读取制表符分隔文件时可以执行的任何操作 –

+0

对,这是我的观点。这里没有完全一般的情况。你需要假设*某事*。无论是引用,还是只有1个字段可以有额外的选项卡,或没有字段可以有选项卡... – mgilson