【问题标题】:How to rename multiple files based on a dictionary in Python?如何根据 Python 中的字典重命名多个文件?
【发布时间】:2021-07-05 06:41:15
【问题描述】:

我的文件如下所示:

file_name_unique_123.pdf
file_name_unique_456.pdf
file_name_unique_789.pdf

我根据一个包含多个列的 csv 文件创建了一个字典,其中一个包含文件的唯一 ID,例如“unique_123”等:

list = csv.DictReader(open('file.csv'), delimiter = ';')
for row in list:
    print(row)

现在我有了字典:

{'ID': 'unique_123', 'name': 'one', 'time': '1',}
{'ID': 'unique_123', 'name': 'two', 'time': '2',}
{'ID': 'unique_123', 'name': 'three', 'time': '3',}

我设法获取文件的 ID 并通过这样做列出它们:

file_IDs = fnmatch.filter(os.listdir(folder), '*unique*.pdf')
[i.split('.', maxsplit = 1)[0].split('_', maxsplit = 5)[5] for i in file_IDs]

所以我现在有这个输出:

['unique_123',
 'unique_456',
 'unique_789']

我需要以某种方式将文件名中的 ID 与字典 ID 匹配,并根据属于该记录的列重命名文件。 例子: file_name_unique_123.pdf 应根据字典中的第一条记录重命名为 one_1.pdf

我该怎么做?提前致谢。

【问题讨论】:

  • 文件名是否总是格式为file_name_unique_xxx.pdf
  • 是的,它们总是采用这种格式。
  • 然后遍历你的 id 列表并调用 os.replace("file_name_"+id+".pdf", dst]
  • 是的,我知道,但我不知道具体如何。我不明白如何从字典中获取正确的数据。请您提供一些代码来帮助我入门吗?

标签: python list dictionary rename


【解决方案1】:

用途:

for row in list:
    old_name = "file_name_{}.pdf".format(row['ID'])
    new_name = "{}_{}.pdf".format(row['name'], row['time'])
    os.rename(old_name, new_name)

另一种方法:如果有冗余记录

import pandas as pd
import re
df = (pd.DataFrame(csv.DictReader(open('file.csv'), delimiter = ';'))
      .set_index(['ID']))
files = fnmatch.filter(os.listdir(folder), '*unique*.pdf')
for file in files:
    unique_id = re.search(r'.*_(unique_[0-9]+).pdf', file).group(1)
    new_name = "{}_{}.pdf".format(df.loc[unique_id, 'name'], 
                                 df.loc[unique_id, 'time'])
    os.rename(file, new_name)

【讨论】:

  • 谢谢。如果 csv 包含具有相同 ID 的两行并且我想跳过第二行怎么办?
  • 而另一个问题是它基于字典,因此如果其中有不作为文件存在的记录,则会发生错误。我需要循环文件,因为文件比记录少。
  • @Pepszi 我已经更新了答案。让我知道它是否适合您。
  • 不幸的是,它没有。 “KeyError:'ID'”发生在以“new_name”开头的行中,因为我想要在您输入“name”的地方输入“ID”。我一直在尝试像您一样使用“名称”来解决它,然后最后一行导致“系统找不到指定的路径:”错误并在其后列出了很多文件名。我认为这是因为在文件名中不使用 ID 某些文件将被命名为相同。有什么想法吗?
  • @Pepszi 我帮不了你太多。您必须检查我们是否不使用ID,然后多个文件将重命名为同一个文件?如果您想使用ID 代替name,那么我可以更新答案。
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 2014-04-22
相关资源
最近更新 更多