从查找文件中批量重命名部分文件名

2024-04-30

edit:请参阅底部以了解我的最终解决方案

我有一个包含约 12,700 个文本文件的目录。

他们的名字是这样的:

1 - Re/ Report Novenator 公开呼吁埋葬 - Lizbett,星期四,2009 年 9 月 10 日.txt

其中前导数字随每个文件递增(例如目录中的最后一个文件以“12,700 - ”开头)。

不幸的是,这些文件没有按时间排序,而我需要它们。幸运的是,我有一个单独的 CSV 文件,其中映射了 ID 号,例如上面示例中的 1 实际上应该是 25(因为它之前有 24 条消息),2 实际上应该是 8,3 应该是 1,依此类推,如下所示:

OLD_FILEID  TIMESORT_FILEID
21      0
23      1
24      2
25      3

除了需要将其与其关联值交换的单个前导数字之外,我不需要更改文件标题中的任何内容。在我看来,这种方法的工作方式是打开一个文件名,检查破折号之前出现的数字,在 CSV 中查找它们,将它们替换为关联的值,然后使用调整后的标题保存文件并继续到下一个文件。

做这样的事情最好的方法是什么?我是一个Python新手,但已经玩够了,可以轻松地遵循大多数指示或建议。谢谢 :)

e:我尽可能按照下面的说明执行此操作,但这不起作用,但我不确定为什么:

import os
import csv
import sys

#open and store the csv file
with open('timesortmap.csv','rb') as csvfile:
timeReader = csv.reader(csvfile, delimiter = ',', quotechar='"')

#get the list of files
for filename in os.listdir('DiggOutput-TIMESORT/'):
oldID = filename.split(' - ')[0]
newFilename = filename.replace(oldID, timeReader[oldID],1)
os.rename(oldID, newFilename)

我得到的错误是:

TypeError: '_csv.reader' object is not subscriptable

我没有使用 DictReader,但那是因为当我使用 csv.reader 并打印行时,它看起来像这样:

['12740', '12738']
['12742', '12739']
['12738', '12740']
['12737', '12741']
['12739', '12742']

当我使用 DictReader 时,它看起来像这样:

{'FILEID-TS': '12738', 'FILEID-OLD': '12740'}
{'FILEID-TS': '12739', 'FILEID-OLD': '12742'}
{'FILEID-TS': '12740', 'FILEID-OLD': '12738'}
{'FILEID-TS': '12741', 'FILEID-OLD': '12737'}
{'FILEID-TS': '12742', 'FILEID-OLD': '12739'}

我在终端中收到此错误:

File "TimeSorter.py", line 16, in <module>
newFilename = filename.replace(oldID, timeReader[oldID],1)
AttributeError: DictReader instance has no attribute '__getitem__'

在 Python 中这应该非常简单,只需使用csv http://docs.python.org/2/library/csv.html and os http://docs.python.org/2/library/os.html模块。

Python 有一个内置的字典类型 http://docs.python.org/2/tutorial/datastructures.html#dictionaries called dict它可用于在处理时将 ​​csv 文件的内容存储在内存中。基本上,您需要使用以下命令读取 csv 文件csv模块并将每个条目转换为字典条目,可能使用OLD_FILEID字段作为键并且TIMESORT_FILEID作为值。

然后您可以使用os.listdir() http://docs.python.org/2/library/os.html#os.listdir获取文件列表并使用循环依次获取每个文件名。 (如果您需要过滤文件名列表以排除某些文件,请查看glob http://docs.python.org/2/library/glob.html模块)。在循环中,您只需要提取与文件关联的数字,可以使用如下方法来完成:

file_number = filename.split(' - ')[0] 

然后打电话os.rename() http://docs.python.org/2/library/os.html#os.rename传入旧文件名和新文件名。可以使用以下命令找到新文件名:

new_filename = filename.replace(file_number, file_mapping[file_number], 1)

Where file_mapping是从 csv 文件创建的字典。这将替换第一次出现的file_number与映射文件中的编号。

Edit

正如 TheodrosZelleke 指出的,按照我上面列出的内容有可能覆盖现有文件。几种可能的策略:

  1. Use os.rename()将文件的重命名版本移动到不同的目录中(例如当前目录的子目录,或者更好的是使用创建的临时目录tempfile.mkdtemp() http://docs.python.org/2/library/tempfile.html#tempfile.mktemp。一旦所有文件都被重命名,使用os.rename将文件从临时目录移动到当前目录。
  2. 为新文件名添加扩展名,例如.tmp,假设所选择的扩展不会引起其他冲突。完成所有重命名后,使用第二个循环重命名文件以排除.tmp扩大。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从查找文件中批量重命名部分文件名 的相关文章

随机推荐