Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用增量索引重命名目录中的文件_Python_Filenames_Prepend - Fatal编程技术网

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

Python 使用增量索引重命名目录中的文件,python,filenames,prepend,Python,Filenames,Prepend,输入:我想给按日期排序的目录中的文件名增加数字。例如,将“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.en

输入:我想给按日期排序的目录中的文件名增加数字。例如,将“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)

最简单的方法是简单地使用一个变量,例如
i
,它将保存数字,并使用某种类型的变量将其前置到字符串,以确保它至少有两位数字:

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
您还可以查看并缩短代码(但请确保在使用之前了解基本原理)。

这应该可以:

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))
这里要了解三件事:

  • glob
    ,这使得这种文件匹配更容易
  • 枚举
    ,它允许您使用索引变量编写循环
  • 格式
    ,特别是
    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
    
  • 如果您想按年龄对文件进行编号,则需要先对其进行排序。调用
    排序
    并传递
    参数。函数
    os.path.getmtime
    将按年龄升序(从最早到最晚)排序

  • 使用
    glob.glob
    获取给定目录中的所有文本文件。到目前为止,它不是递归的,但是如果您使用的是python3,那么递归扩展是一个最小的添加

  • str.zfill
    用于格式为
    0x

  • 使用
    os.rename
    重命名文件


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

    我也要这么说,减去
    glob
    (我认为这是一个很好的加法),我会使用
    枚举(glob.glob(path),1)
    来避免以后出现
    I+1
    。这是一个很好的改进!只是编辑了它。谢谢。您是否希望有一个与文件名中现有编号无关的独立计数器?或者您希望使用文件名中的数字,并将其设置在文件的开头?如果您希望按年龄顺序重命名它们,则需要
    os.listdir
    ,然后在
    os.path.getmtime
    上单击
    sorted
    。隐马尔可夫模型。。。如果这确实是您的要求,我可能需要重新打开此文件,但是您在问题中没有明确说明这一点,所以这一点由您决定。@StacyM将其明确添加到您的问题中,并使其更加清楚。我会重新打开它。还要弄清楚它是
    .txt
    文件还是特定目录中的所有文件。细节很重要。@StacyM没有人会因为你不知道网站是如何工作的而禁止你。:)无论如何,我不相信任何答案都能解决您对基于年龄进行编号的担忧,因此我冒昧地添加了我自己的答案。记住你可以(仔细想想,因为你只能接受1。你的格式有点错误。我建议你使用
    '{:02d}{}。格式(I,f)
    ,但是你的格式可以用
    str(I).zfill(2)这样的东西来修复+'.'+f
    @smarx噢,这更简单。谢谢!@StacyM它不会中断。它只是不再追加
    0
    。这就是zfill的工作方式。如果你要处理99个以上的文件,我建议使用
    .zfill(3)
    而不是2。@StacyM将其转换为一个列表:
    列表((已排序的\u文件中x的os.path.basename(x))
    @StacyM ohhh现在我明白了问题所在。不要像那样使用
    os.path.basename
    os.rename
    需要完整的路径。我已经对我的答案进行了编辑。希望这样可以。
    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
    
    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')