Код не выводится в правильную папку Python - PullRequest
0 голосов
/ 05 марта 2019

поэтому у меня есть некоторый код, который открывает текстовый файл, содержащий список путей к файлам, например:

C: / Users / User / Desktop / mini_mouse / 1980

C: / Users / Пользователь / Рабочий стол / mini_mouse / 1982

C: / Users / Пользователь / Рабочий стол / mini_mouse / 1984

Затем он открывает эти файлы по отдельности, построчно-линии, и делает некоторую фильтрацию к файлам.Затем я хочу, чтобы он выводил результат в совершенно другую папку с именем:

output_location = 'C:/Users/User/Desktop/test2/'

. В моем нынешнем виде код выводит результат в то место, где был открыт исходный файл, т.е. если он открывает файл C: / Users / User / Desktop / mini_mouse / 1980, выходные данные будут в той же папке с именем '1980_filtered'.Я, однако, хотел бы, чтобы вывод вошел в output_location.Кто-нибудь может увидеть, где я иду не так в настоящее время?Любая помощь будет принята с благодарностью!Вот мой код:

import os

def main():
stop_words_path = 'C:/Users/User/Desktop/NLTK-stop-word-list.txt'
stopwords = get_stop_words_list(stop_words_path)
output_location = 'C:/Users/User/Desktop/test2/'

list_file = 'C:/Users/User/Desktop/list_of_files.txt'

with open(list_file, 'r') as f:
    for file_name in f:
        #print(file_name)
        if file_name.endswith('\n'):
            file_name = file_name[:-1]
        #print(file_name)
        file_path = os.path.join(file_name)  # joins the new path of the file to the current file in order to access the file

        filestring = ''  # file string which will take all the lines in the file and add them to itself
        with open(file_path, 'r') as f2:  # open the file
            print('just opened ' + file_name)
            print('\n')
            for line in f2:  # read file line by line

                x = remove_stop_words(line, stopwords)  # remove stop words from line
                filestring += x  # add newly filtered line to the file string
                filestring += '\n'  # Create new line

        new_file_path = os.path.join(output_location, file_name) + '_filtered'  # creates a new file of the file that is currenlty being filtered of stopwords
        with open(new_file_path, 'a') as output_file:  # opens output file
            output_file.write(filestring)


if __name__ == "__main__":
    main()

Ответы [ 2 ]

1 голос
/ 05 марта 2019

На основе вашего кода это выглядит как проблема в строке:

new_file_path = os.path.join(output_location, file_name) + '_filtered'

В Python os.path.join () любой абсолютный путь (или буква диска в Windows) во входных данных отбрасывает все перед ним и перезапускает соединение с нового абсолютного пути (или буквы диска) , Поскольку вы звоните имя_файла напрямую из list_of_files.txt , и у вас есть каждый путь, отформатированный там относительно диска C:, каждый вызов os.path.join () отбрасывает output_location и восстанавливает исходный путь к файлу.

См. Почему в этом случае не работает os.path.join ()? для лучшего объяснения этого поведения.

При построении выходного пути вы можете удалить имя файла, например, "1980", из пути "C: / Users / User / Desktop / mini_mouse / 1980" и присоединиться на основе output_location переменная и имя изолированного файла.

1 голос
/ 05 марта 2019

Если вы используете Windows (потому что у вас нормальная файловая система Windows), вы должны использовать обратную косую черту в своих путевых именах.Обратите внимание, что это только в Windows.Я знаю, что это раздражает, поэтому я изменил это для вас (пожалуйста :)).Вы также должны использовать две обратные косые черты, так как он попытается использовать его как escape-символ.

import os

def main():
stop_words_path = 'C:\\Users\\User\\Desktop\\NLTK-stop-word-list.txt'
stopwords = get_stop_words_list(stop_words_path)
output_location = 'C:\\Users\\User\\Desktop\\test2\\'

list_file = 'C:\\Users\\User\\Desktop\\list_of_files.txt'

with open(list_file, 'r') as f:
    for file_name in f:
        #print(file_name)
        if file_name.endswith('\n'):
            file_name = file_name[:-1]
        #print(file_name)
        file_path = os.path.join(file_name)  # joins the new path of the file to the current file in order to access the file

        filestring = ''  # file string which will take all the lines in the file and add them to itself
        with open(file_path, 'r') as f2:  # open the file
            print('just opened ' + file_name)
            print('\n')
            for line in f2:  # read file line by line

                x = remove_stop_words(line, stopwords)  # remove stop words from line
                filestring += x  # add newly filtered line to the file string
                filestring += '\n'  # Create new line

        new_file_path = os.path.join(output_location, file_name) + '_filtered'  # creates a new file of the file that is currenlty being filtered of stopwords
        with open(new_file_path, 'a') as output_file:  # opens output file
            output_file.write(filestring)


if __name__ == "__main__":
    main()
...