2016-07-11 4 views
0

Я пишу мини-программу, и внутри моей программы есть функция, которая читает в текстовом файле и возвращает отдельные слова из предложения. Однако у меня возникают проблемы с отображением отдельных слов, даже если я возвращаю их. Я действительно не понимаю, почему, если у меня нет большой проблемы с моими пробелами. Не могли бы вы помочь? Для вашей информации я всего лишь новичок. Программа запрашивает у пользователя ввода имени файла программа считывает файл в функции, то следует включить тьфу в список и найти отдельные слова из списка, и сохраняет их в этом спискеПочему не печатаются отдельные слова?

file_input = input("enter a filename to read: ") 
#unique_words = [] 
def file(user): 
    unique_words = [] 
    csv_file = open(user + ".txt","w") 
    main_file = csv_file.readlines() 
    csv_file.close() 


    for i in main_list: 
      if i not in unique_words: 
        unique_words.append(i) 


    return unique_words 

#display the results of the file being read in 

print (file(file_input)) 

К сожалению Я использую блокнот:

check to see if checking works 
+2

где 'individual_words' определяется? вы после 'unique_words.append'? – EdChum

+0

Возможно, это то, что означает 'unique_words', но OP должен ** перемещать это внутри функции **. –

+0

Извините, но все еще не работает – pythonslittlehelper

ответ

2

Кажется, у вас есть только одно слово для каждой строки в вашем файле.

def read_file(user): 
    with open(user + ".txt","r") as f: 
     data = [ line.strip() for line in f.readlines() ] 
    return list(set(data)) 

--update --- если у вас есть более одного слова в каждой строке и разделены пространством

def read_file(user): 
     with open(user + ".txt","r") as f: 
      data = [ item.strip() for line in f.readlines() for item in line.split(' ')] 
     return list(set(data)) 
+0

Я бы вернул 'list'' set', потому что это то, что хочет OP. –

+0

@ Ev.Kounis thank you.updated – galaxyan

+0

@ Ev.Kounis Я бы вернул 'set', потому что' list' подразумевает какой-то порядок, который 'set' будет уничтожен. –

0

Если все, что вы хотите, список каждого слова, которое происходит в тексте , вы делаете слишком много работы. Вы хотите что-то вроде этого:

unique_words = [] 
all_words = [] 
with open(file_name, 'r') as in_file: 
    text_lines = in_file.readlines() # Read in all line from the file as a list. 
for line in text_lines: 
    all_words.extend(line.split()) # iterate through the list of lines, extending the list of all words to include the words in this line. 
unique_words = list(set(all_words)) # reduce the list of all words to unique words. 
0

Вы можете упростить свой код, используя set, потому что он будет содержать только уникальные элементы.

user_file = raw_input("enter a filename to read: ") 

#function to read any file 
def read_file(user): 
    unique_words = set() 
    csv_file = open(user + ".txt","r") 
    main_file = csv_file.readlines() 
    csv_file.close() 

    for line in main_file: 
     line = line.split(',') 
     unique_words.update([x.strip() for x in line]) 

    return list(unique_words) 

#display the results of the file being read in 
print (read_file(user_file)) 

Выход для файла с содержимым:

Hello, world1 
Hello, world2 

является

['world2', 'world1', 'Hello'] 
1

На самом деле, я не могу воспроизвести вам проблему. Учитывая правильный CSV файл ввода 1), такие как

a,b,c,d 
e,f,g,h 
i,j,k,l 

ваша программа печатает это, который кроме последнего '' кажется штраф:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', ''] 

Однако, вы можете значительно упростить код ,

  • вместо присоединяя , к каждой строке, а затем присоединения к нему "", просто соединим , (это будет также избавиться от последнего '')
  • сделать strip непосредственно в join, используя генератор выражение

    main_string = ",".join(line.strip() for line in main_file) 
    
  • вместо join, а затем split, используйте двойной для цикла список понимание:

    main_list = [word for line in csv_file for word in line.strip().split(",")] 
    
  • вместо того, чтобы делать все это вручную, используйте csv модуль:

    main_list = [word for row in csv.reader(csv_file) for word in row] 
    
  • при условии, что заказ не важно, используйте set для удаления дубликатов:

    unique_words = set(main_list) 
    
  • и если заказ важен, вы можете (ab) использовать collections.OrderedDict:

    unique_words = list(collections.OrderedDict((x, None) for x in main_list)) 
    
  • использование with, чтобы открыть и закрыть файл

Собираем все вместе:

import csv 
def read_file(user): 
    with open(user + ".txt") as csv_file: 
     main_list = [word for row in csv.reader(csv_file) for word in row] 
     unique_words = set(main_list) # or OrderedDict, see above 
     return unique_words 

1) Update: Причина, почему не работает в вашем файле «Пример текста ...», показанном в вашем редактировании, is не CSV-файл. CSV означает «значение, разделенные запятые», но слова в том, что файл отделенных пробелов, поэтому вам придется split пробелами вместо запятой:

def read_file(user): 
    with open(user + ".txt") as text_file: 
     main_list = [word for line in text_file for word in line.strip().split()] 
     return set(main_list) 
Смежные вопросы