从查找fi批量重命名文件名的一部分

2024-06-09 02:11:46 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:查看底部了解我的最终解决方案

我有一个大约12700个文本文件的目录。在

他们有这样的名字:

1-回复/报告Novenator public call for bury-作者:Lizbett,2009年9月10日,星期四.txt

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

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

OLD_FILEID  TIMESORT_FILEID
21      0
23      1
24      2
25      3

我不需要更改文件标题中的任何内容,除了这个前导数字,我需要与其相关联的值交换。在我的头脑中,这样做的方法是打开一个文件名,检查破折号前出现的数字,在CSV中查找它们,用关联的值替换它们,然后用调整后的标题保存文件,然后转到下一个文件。在

做这样的事情最好的方法是什么?我是一个python新手,但已经玩得够舒服了,可以按照大多数指示或建议来做。谢谢:)

e:按照下面的说明,我尽我所能做了这件事,但我不知道为什么:

^{pr2}$

我得到的错误是:

TypeError: '_csv.reader' object is not subscriptable

我不使用听写器,但那是因为当我使用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__'

Tags: 文件csv方法目录标题错误数字old
2条回答

在Python中只使用^{}os模块,这应该非常简单。在

Python有一个内置的dictionary type,名为dict,可以用来在处理时将csv文件的内容存储在内存中。基本上,您需要使用csv模块读取csv文件,并将每个条目转换为字典条目,可能使用OLD_FILEID字段作为键,TIMESORT_FILEID作为值。在

然后可以使用^{}获取文件列表,并使用循环依次获取每个文件名。(如果需要筛选文件名列表以排除某些文件,请查看^{}模块)。在循环中,只需提取与文件相关联的编号,可以使用以下方法完成:

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

然后调用^{},传入旧文件名和新文件名。新的文件名可以通过以下方式找到:

^{pr2}$

其中file_mapping是从csv文件创建的字典。这将用映射文件中的数字替换第一次出现的file_number。在

编辑

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

  1. 使用os.rename()将文件的重命名版本移动到另一个目录(例如,当前目录的子目录,或者更好的是使用^{}创建的临时目录)。重命名所有文件后,使用os.rename将文件从临时目录移动到当前目录。在
  2. 在新文件名中添加一个扩展名,例如.tmp,假设选择的扩展名不会引起其他冲突。完成所有重命名后,使用第二个循环重命名文件以排除.tmp扩展名。在

下面是我和朋友们一起解决的问题,如果有人发现并寻找这个:

import os
import csv
import sys

IDs = {}

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

        # build a dictionary with the associated IDs
        for row in timeReader:
              IDs[ row[0] ] = row[1]

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

相关问题 更多 >