首页 > 解决方案 > 类型错误:+ 不支持的操作数类型:“nt.DirEntry”和“str”

问题描述

我需要将在 3.7.1 版本上编写的 Python 脚本降级到 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'))

这里是堆栈跟踪:

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'

我想这将是几个解决方法中的第一个。谢谢!

标签: python

解决方案


您的函数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))

推荐阅读