修改:查看最终解决方案的底部
我有一个~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中查找它们,用相关值替换它们,然后用调整后的标题保存文件然后去到下一个文件。
做这样的事情最好的方法是什么?我是一个蟒蛇新手,但已经玩了足够的感觉舒适按照大多数方向或建议。谢谢:)
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__'
答案 0 :(得分:1)
使用csv
和os模块在Python中实现这一点非常简单。
Python有一个名为dict
的内置dictionary type,可用于在处理时将csv文件的内容存储在内存中。基本上,您需要使用csv
模块读取csv文件,并将每个条目转换为字典条目,可能使用OLD_FILEID
字段作为键,TIMESORT_FILEID
作为值。
然后,您可以使用os.listdir()
获取文件列表,并使用循环依次获取每个文件名。 (如果您需要过滤文件名列表以排除某些文件,请查看glob
模块)。在循环中,您只需要提取与文件关联的数字,这可以使用以下内容完成:
file_number = filename.split(' - ')[0]
然后调用os.rename()
传递旧文件名和新文件名。可以使用以下内容找到新文件名:
new_filename = filename.replace(file_number, file_mapping[file_number], 1)
其中file_mapping
是从csv文件创建的字典。这将使用映射文件中的数字替换第一次出现的file_number
。
修改强>
正如TheodrosZelleke指出的那样,有可能按照我上面列出的内容覆盖现有文件。几种可能的策略:
os.rename()
将重命名的文件版本移动到不同的目录(例如当前目录的子目录,或者更好的是,使用tempfile.mkdtemp()
创建的临时目录。一旦所有文件都有已重命名,使用os.rename
将文件从临时目录移动到当前目录。.tmp
,假设所选的扩展名不会导致其他冲突。完成所有重命名后,请使用第二个循环重命名文件以排除.tmp
扩展名。答案 1 :(得分:0)
以下是我最终与朋友一起制作的内容,如果有人找到并寻找这个:
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)