2015-07-12 89 views
0

我想查看.txt文件并在其中创建单词列表。我希望这些单词是字符串,但输出使它们成为列表。Python:字符串列表

import csv, math, os 
os.chdir(r'C:\Users\jmela\canopy') 
f=open("romeo.txt") 

words = [] 

    for row in csv.reader(f): 
     line = str(row) 
     for word in line.split(): 
      if word not in words: 
       print word 
       words.append(word) 

    words.sort() 
    print words 

有谁知道我在做什么错?

+3

为什么在地球上,您将行转换为字符串,然后将其拆分? – Kasramvd

+0

这并不直接解决您的问题,但如果您想要一个没有重复值的集合,请考虑使用集合。 – Kevin

+1

你正在得到一个字符串列表,你可能会混淆它,因为它们中的一些已经有'['在其中。请参阅@Kasra评论为什么 – yuvi

回答

1

根据您的最新评论,看起来并不像您真的需要使用csv阅读器。只是试试这个:

words = [] 
for line in open("romeo.txt", "r"): 
    for word in line.split(): 
     if word not in words: 
      words.append(word) 

words.sort() 
print words 

和凯文建议,使用set(),而不是列表。

+0

谢谢,这完美的作品。 我不跟随我的原代码出了什么问题。你知道为什么这不起作用吗? – Joe

+0

是的,就像我说的csv阅读器根据给定的分隔符将每一行分成列(默认为逗号)。所以行实际上就像是[“这是一个句子”](列表中有一个字符串是整行,因为没有逗号),然后你把它变成了字符串(例如'[“这是一个句子”] '),然后你试图根据空格拆分它...请再阅读一下csv阅读器,下次你应该调试并看看你在循环的每一次迭代中得到了什么,它会为你节省一些时间。 :) –

+0

我明白这一点,并从你的解释中了解到。谢谢。 – Joe

0

你可以使用set来保留你的话。这会给你一个独特的单词列表。任何非alpha字符并转换为空格。该行被分成单词和小写以确保它们匹配。

word_set = set() 
re_nonalpha = re.compile('[^a-zA-Z ]+') 

with open(r"romeo.txt", "r") as f_input: 
    for line in f_input: 
     line = re_nonalpha.sub(' ', line) # Convert all non a-z to spaces 

     for word in line.split(): 
      word_set.add(word.lower()) 

word_list = list(word_set) 
word_list.sort() 
print word_list 

这将使你持有下列单词的列表:

['already', 'and', 'arise', 'breaks', 'but', 'east', 'envious', 'fair', 'grief', 'is', 'it', 'juliet', 'kill', 'light', 'moon', 'pale', 'sick', 'soft', 'sun', 'the', 'through', 'what', 'who', 'window', 'with', 'yonder'] 

更新还去除任何标点。

+0

确保占用额外的空格或连字符 – ytpillai

0

不要将文本文件读为csv。只需删除所有标点符号和非字母/非空格字符,如下所示:

def replacePunct(string): 
    alphabets = " abcdefghijklmnopqrstuvwxyz" 
    for s in string: 
     if s not in alphabets: 
      string = string.replace(s, " ") 
      replacePunct(string) 
    string = string.split() 
    string = [x for x in string if x != " "] 
    return {set(string): len(string)} 
+0

以普通文本文件的形式读取文件,并为每一行运行此程序 – ytpillai