首页 > 解决方案 > 如何将带有“.py”扩展名的文件名更改为带有文件夹和子文件夹的“.txt”

问题描述

对于文件夹和子文件夹中的所有文件,我想将扩展名为“.py”的文件更改为“.txt”。我对我的代码所做的是:

def py_to_txt(directory):
    for foldername, subfolders, filenames in os.walk(dire):
        print(filenames)
        for f in filenames :
            if f.endswith('.py'):
                base = os.path.splitext(f)[0]
                os.rename(f, base + '.txt')

并且此代码仅更改父目录中的第一个文件扩展名,然后引发以下错误:

---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-69-ed0d85ebad81> in <module>
----> 1 py_to_txt(dire)

<ipython-input-68-1efd842876ed> in py_to_txt(directory)
      5             if f.endswith('.py'):
      6                 base = os.path.splitext(f)[0]
----> 7                 os.rename(f, base + '.txt')
      8 

FileNotFoundError: [Errno 2] No such file or directory: 'file2.py' -> 'file2.txt'

什么是正确的做法?

标签: pythonfile

解决方案


我可能会注意到的一件事是您缺少foldername对每个文件名的添加f- 没有它,您要求它从当前工作目录中删除文件,而不是从它们的实际位置删除文件。

尝试:

def py_to_txt(directory):
    for foldername, subfolders, filenames in os.walk(directory):
        print(filenames)
        for f in filenames :
            if f.endswith('.py'):
                base = os.path.splitext(f)[0]
                os.rename(os.path.join(foldername, f), 

os.path.join(文件夹名,base + '.txt'))


这里的问题是当你去 use 时os.walk(),它​​返回三个项目:

  1. 当前遍历的目录(我们称之为base
  2. base中的目录
  3. 基地内的文件

所以如果我们有一个文件夹:

py/
  1.py
  2.py

运行os.walk('py/')将产生:

('py/', (), ('1.py', '2.py'))

请注意,这些最后的项目实际上并不包含它们自己的完整路径——它们是路径的最后一部分,即文件的名称和扩展名。因此,如果您想要一个对象的绝对路径,您必须将基址连接到文件名,如下所示:

for base, dirs, files in os.walk(directory):
    for filename in files:
        full_path = os.path.join(base, filename)
        print(filename, 'is different than', full_path)

推荐阅读