TypeError: неподдерживаемые типы операндов для +: 'nt.DirEntry' и 'str' - PullRequest
0 голосов
/ 17 июня 2020

Мне нужно понизить версию Python скрипта, написанного для версии 3.7.1, до версии 3.6, и я изо всех сил пытаюсь заставить его работать.

Вот сценарий:

#!/usr/bin/env python3
import fileinput
import os


def replace_function(entries):
    with fileinput.FileInput(entries, inplace=True) as file:
        for line in file:
            line = line.replace('OLD', 'NEW')
            print(line, end='')


def retrieve_files_function(folder):
    return os.scandir("work\\" + folder)


replace_function(retrieve_files_function('function'))
replace_function(retrieve_files_function('package'))

И вот stacktrace:

Traceback (most recent call last):
  File "C:/Users/me/PycharmProjects/replacer/replaces", line 17, in <module>
    replace_function(retrieve_files_function('function'))
  File "C:/Users/me/PycharmProjects/replacer/replaces", line 8, in replace_function
    for line in file:
  File "C:\Users\me\AppData\Local\Programs\Python\Python36\lib\fileinput.py", line 250, in __next__
    line = self._readline()
  File "C:\Users\me\AppData\Local\Programs\Python\Python36\lib\fileinput.py", line 331, in _readline
    self._filename + (self._backup or ".bak"))
TypeError: unsupported operand type(s) for +: 'nt.DirEntry' and 'str'

Думаю, это будет первый из нескольких обходных путей. Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Ваша функция retrieve_files_function возвращает список os.DirEntry объектов, но похоже, что вы хотите, чтобы она возвращала список str. Для большей ясности, когда вы вызываете os.scandir(), вместо того, чтобы просто возвращать имя файла, он возвращает объект, который содержит дополнительную информацию о файле. Если вместо этого вы вызовете os.listdir(), он вернет только имя файла в виде строки, и тогда, я думаю, ваша функция должна работать.

Документация по os.listdir, os.scandir и os.DirEntry может все можно найти здесь: https://docs.python.org/3.7/library/os.html

Код для retrieve_files_function будет выглядеть так:

def retrieve_files_function(folder):
    return os.listdir(os.path.join("work\\", folder))
0 голосов
/ 17 июня 2020

Благодаря @captnsupremo мне удалось заставить его работать с Python 3.6.8 следующим образом:

def retrieve_files_function(folder):
    return [f"work\\{folder}\\{name}" for name in os.listdir(os.path.join("work", folder))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...