python - 如何将带有“.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'
什么是正确的做法?
解决方案
我可能会注意到的一件事是您缺少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()
,它返回三个项目:
- 当前遍历的目录(我们称之为base)
- base中的目录
- 基地内的文件
所以如果我们有一个文件夹:
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)
推荐阅读
- ios - 如何停止快速检测物体?
- pandas - 由于“日期”列,无法将列表插入数据框中?
- reactjs - 在同一个组件中映射和渲染两个不同的数组 - React
- python-3.x - 如何读取 ibd 文件中的字节数(subprocess.check_output 返回码)
- java - jar 中没有主要清单属性
- png - 使用 binwalk 仅提取一种文件类型
- spring - Spring-Boot:组件的可扩展性
- python - 'function'对象在django中没有属性'get'错误
- node.js - 主版本和cpanel版本之间的NPM版本差异
- python - 在 Windows 10 上安装 TensorFlow 时出现问题