Не удается добавить условный результат в новый список - PullRequest
0 голосов
/ 06 сентября 2018

Я очень плохо знаком с Python или любым другим языком программирования в целом.

Для справки:

  1. Назначение
  2. Мой код
  3. Вопрос

1.) Задание для моего класса таково: прочитайте из текстового файла «word.txt» и запишите в новый текстовый файл слова из первого текстового файла, которые соответствуют критериям. Например, если функция getListEnd ('s', 'word.txt', 'word1.txt') и критерием является то, что все слова в файле должны заканчиваться символом 's', тогда мой ifile word.txt = [яблоки, морковь, сыр, горчица, проблемы] будут отсортированы в текстовый файл word1.txt = [яблоки, морковь, проблемы]

2.) Вот мой код:

mf1 = open("/Users/XXXX/word.txt", "r")
mf2 = open("/Users/XXXX/word2.txt", "w+")
mylist1=[]                            #list for storing word.txt strings
mylist2=[]                            #list for storing sorted strings

def sort(c):                          #function for sorting mylist1 for 
    for i in mylist1:                        criteria into my list2       
        if c==i[-1]:
            mylist2.append(i)

def getListEnd(c, ifile, ofile):
    for s in mf1:                      #loop for appending word.txt to list 1
        mylist1.append(s)                   
    print(len(mylist1))                #check if mylist1 contains word.txt
    sort(c)                            #append sorted words to list2
    with open('word2.txt', 'w+') as mf2:   #write into word1.txt list2
        for listitem in mylist2:
            mf2.write('%s\n' % listitem)

getListEnd('s', 'word.txt', 'word2.txt')

3.) Итак, вопрос в том, почему всякий раз, когда я пытаюсь добавить в mylist2 отсортированные слова, ничего не происходит? То есть, когда я проверяю длину mylist2, он говорит 0, хотя в файле word.txt много слов, заканчивающихся на s? Я знаю, что при проверке myList1 на наличие символов, заканчивающихся последней буквой ', произошла ошибка, но я не знаю, что и не могу добавить ее в mylist2.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Чтение строк из файла с циклом for x in file дает вам символ новой строки в конце каждой строки.

Итак, i[-1] - это символ новой строки, а не последняя буква слова.

0 голосов
/ 06 сентября 2018

Вот пример:

with open('words1.txt', 'w') as f_object:
       f_object.write("Apples" + "\n")
       f_object.write("Rubles" + "\n")
       f_object.write("Nope" + "\n")
       f_object.write("Nah" + "\n")
       f_object.write("Georges" + "\n")


f_object.close()
print("Done")

with open('words1.txt', 'r') as f:
lines = f.readlines()


with open('words2.txt', 'w') as f_ob:
     for line in lines:
        line = line.rstrip()
        if line[-1] == 's':
             f_ob.write(line + '\n')

print("Done")

Мы можем просто сделать условие, что если слово оканчивается на 's', мы добавим его в новый файл .txt. Например, мы можем получить последний индекс в строке, когда мы перебираем каждую строку. «если» последний индекс строки равен s, то мы, очевидно, можем записать строку в файл. Если нет, то пропущу. Вывод в вашем файле words2.txt будет:

Apples
Rubles
Georges
0 голосов
/ 06 сентября 2018

В вашей программе две вещи:

  1. Вы писали в выходной файл до того, как отсортировали ввод
  2. Вы включали символы новой строки в свою строку, поэтому, сравнивая последний символ, вы фактически сравнивали символы новой строки.

Вот ваша программа с комментариями об изменениях:

# mf1 = open("word.txt", "r")      # Don't do this here. You read it in in your with block anyway.
# mf2 = open("word2.txt", "w+").   # Don't do this here. You write it in your with block anyway
mylist1=[]
mylist2=[]

def sort(c):
    for i in mylist1:
        if c==i[-1]:
            mylist2.append(i)

def getListEnd(c, ifile):
    with open(ifile, "r") as mf1:
        for s in mf1:  # the strings will still contain the newlines if read this way
                       # so when you check the end of the string you'll actually be comparing
                       # a newline character.
            if "\n" in s:
                mylist1.append(s[:-1]) # if there's a newline character, 
                                       # don't include it when appending to the list
            else:
                mylist1.append(s)
        print("mylist length: ", len(mylist1))
        print("mylist1: ", mylist1)
        sort(c)

getListEnd('s', 'word.txt') # you don't need to pass it any info about the output file
print("mylist2: ", mylist2)

## Your writing block has to come after you've sorted it! Not before
with open('word2.txt', 'w+') as mf2:
    for listitem in mylist2:
        mf2.write('%s\n' % listitem)

В более общем смысле:

Чтобы создать список только с элементами, заканчивающимися буквой "s", вы можете просто сделать:

input_list = ['apples', 'carrot', 'johns', 'list']
output = [i for i in input_list if "s" == i[-1]]

print(output)
>> ['apples', 'johns']

Строка output = [i for i in input_list if "s" == i[-1] выполняет итерацию по списку input_list с i и проверяет каждый элемент, чтобы увидеть, является ли последний символ каждой строки i[-1] символом 's'. Затем он возвращает список со всеми элементами, которые соответствуют условию. Более выразительный способ кодирования это будет:

for word in input_list:
    if word[-1] == "s":
        output.append(word)

С чтением и записью файлов в python безопаснее выполнять их с помощью with операторов, так как это гарантирует, что у вас нет закрытых файлов, висящих вокруг / безопаснее с точки зрения области видимости.

Более простая версия:

Вот игрушечная программа, которая, я думаю, делает то, что вы хотите:

with open("word.txt", "r") as f:
    mylist1 = f.read().split("\n") # splits the input file around newlines

mylist2 = [i for i in mylist1 if "s" == i[-1]] 

with open("word2.txt", "w") as f:
    for word in mylist2:
        f.write(f"{word}\n") # writes word into the file

если word.txt был:

john
apples
carrots
lewis

Тогда word2.txt становится:

apples
carrots
lewis
...