使用增量索引重命名目录中的文件

问题描述 投票:2回答:5

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

test1是最老的,测试4是最新的。

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

我尝试过这样的事情。但它为文件名中的每个字符添加了“01_”。

new_test_names = ['01_'.format(i) for i in file]
print (new_test_names)
python filenames prepend
5个回答
5
投票
  1. 如果您想按年龄对文件进行编号,则需要先对它们进行排序。你调用sorted并传递key参数。函数os.path.getmtime将按年龄的升序排序(从最旧到最新)。
  2. 使用glob.glob获取给定目录中的所有文本文件。它现在不是递归的,但如果你使用python3,递归扩展是一个最小的加法。
  3. str.zfill用于0x_形式的字符串
  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进行检查总是有帮助,以捕获不应发生的任何错误。


3
投票

这应该工作:

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修饰符,它打印两位数字(零填充)。

0
投票
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)]

0
投票

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

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

0
投票

最简单的方法是简单地使用一个变量,例如i,它将保存数字并使用某种formatting将其添加到字符串中,以保证它至少有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以使您的代码更短(但请确保在使用之前了解基础知识)。

© www.soinside.com 2019 - 2024. All rights reserved.