重命名具有增量索引的目录中的文件



>INPUT:我想在按日期排序的目录中向文件名添加越来越多的数字。例如,添加"01_"、"02_"、"03_"...到下面的这些文件。

test1.txt (oldest text file)
test2.txt
test3.txt
test4.txt (newest text file)

这是到目前为止的代码。我可以获取文件名,但文件名中的每个字符似乎是列表中自己的项目。

import os
for file in os.listdir("/Users/Admin/Documents/Test"):
if file.endswith(".txt"):
print(file)

预期成果是:

01_test1.txt
02_test2.txt
03_test3.txt
04_test4.txt

测试1 是最古老的,测试 4 是最新的。

如何为每个文件名添加 01_、02_、03_、04_?

我试过这样的事情。但它会在文件名中的每个字符中添加一个"01_"。

new_test_names = ['01_'.format(i) for i in file]
print (new_test_names)
  1. 如果要按年龄对文件进行编号,则需要先对它们进行排序。调用sorted并传递key参数。函数os.path.getmtime将按年龄升序(从最早到最新(排序。

  2. 使用glob.glob获取给定目录中的所有文本文件。到目前为止,它不是递归的,但是如果您使用的是python3,则递归扩展是最小的补充。

  3. 对格式的字符串使用str.zfill0x_

  4. 使用os.rename重命名文件

import glob
import os
sorted_files = sorted(
glob.glob('path/to/your/directory/*.txt'), key=os.path.getmtime)
for i, f in enumerate(sorted_files, 1):
try:
head, tail = os.path.split(f)            
os.rename(f, os.path.join(head, str(i).zfill(2) + '_' + tail))
except OSError:
print('Invalid operation')

它总是有助于使用try-except进行检查,以捕获任何不应该发生的错误。

这应该有效:

import glob
new_test_names = ["{:02d}_{}".format(i, filename) for i, filename in enumerate(glob.glob("/Users/Admin/Documents/Test/*.txt"), start=1)]

或者没有列表理解:

for i, filename in enumerate(glob.glob("/Users/Admin/Documents/Test/*.txt"), start=1):
print("{:02d}_{}".format(i, filename))

这里要了解的三件事:

  1. glob,这使得这种文件匹配更容易。
  2. enumerate,它允许您编写带有索引变量的循环。
  3. format,特别是02d修饰符,它打印两位数(零填充(。

两种使用前导零格式化整数的方法。

1.使用.format

import os
i = 1
for file in os.listdir("/Users/Admin/Documents/Test"):
if file.endswith(".txt"):
print('{0:02d}'.format(i) + '_' + file)
i+=1

2.使用.zfill

import os
i = 1
for file in os.listdir("/Users/Admin/Documents/Test"):
if file.endswith(".txt"):
print(str(i).zfill(2) + '_' + file)
i+=1

最简单的方法是简单地拥有一个变量,例如i,它将保存数字并使用某种格式将其附加到字符串前面,以保证它至少有 2 位数字:

import os
i = 1
for file in os.listdir("/Users/Admin/Documents/Test"):
if file.endswith(".txt"):
print('%02d_%s' % (i, file)) # %02d means your number will have at least 2 digits
i += 1

您还可以查看enumerateglob,以使您的代码更短(但在使用它之前请确保您了解基础知识(。

test_dir = '/Users/Admin/Documents/Test'
txt_files = [file
for file in os.listdir(test_dir)
if file.endswith('.txt')]
numbered_files = ['%02d_%s' % (i + 1, file)
for i, file in enumerate(txt_files)]

相关内容

  • 没有找到相关文章

最新更新