python 处理10000个txt,每个文件夹里面放1000个。

本文介绍了一种有效的文件批量处理方法,通过将大量标题列表按每1000个一组进行划分,然后遍历每一组标题并打印出来。这种方法适用于处理大规模数据集,特别是在数据库操作或文件系统管理中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 fileNumberInDiretory = 1000
2     title_list = getChongFuTitle(cursor)
3     DiretoryNums = math.ceil(len(title_list)/fileNumberInDiretory)
4 
5     diff_match_split = [title_list[i:i + 1000] for i in range(0, len(title_list), 1000)]
6 
7     for i, j in zip(range(0, diff_match_split.__len__()), range(0, diff_match_split.__len__())):
8         for title in diff_match_split[i]:
9             print("title:" + str(title))

 

转载于:https://www.cnblogs.com/dhName/p/10837583.html

<think>我们计划写一个Python脚本,用于批量修改指定文件夹中的文件名。主要功能:1.用户可以指定一个目录。2.可以选择按照某种规则重命名,例如:添加前缀、后缀、替换特定字符串、序列化重命名等。3.考虑到安全性,应该避免覆盖已有文件,并允许用户预览更改。我们将设计一个函数,允许用户选择不同的重命名模式,并能够预览更改后再执行。步骤:1.导入必要的模块:os,argparse(或者使用sys.argv,但argparse更灵活)2.定义重命名函数,支持不同的模式(模式可以用字符串指定,如'prefix','suffix','replace', 'sequence'等)3.对于序列化重命名,我们可以要求用户提供基础名称和起始序号。4.对于替换,要求用户提供旧字符串和新字符串。5.添加预览功能,即先打印出原文件名和修改后的文件名,然后询问用户是否确认执行。注意:为了避免错误,我们应该检查目标目录是否存在,以及重命名后是否会有冲突。由于要求是写一个Python文件,我们可以将其设计为命令行工具。设计命令行参数:-d, --directory:指定目标目录(默认为当前目录)-m, --mode:重命名模式(prefix, suffix, replace, sequence)--prefix:当模式为prefix时,指定前缀--suffix:当模式为suffix时,指定后缀(注意:后缀是添加在扩展名之前还是之后?通常我们希望在扩展名之前添加后缀,以保持文件类型不变)--old_str:当模式为replace时,指定要替换的字符串--new_str:当模式为replace时,指定替换后的字符串--base_name:当模式为sequence时,指定基础名称(例如:image_)--start:序列化起始序号(默认为1)另外,我们可以添加一个--preview参数,用于只预览而不实际执行。但是,为了简单起见,我们可以先预览,然后询问用户是否确认。实现细节:1.遍历目录中的文件(注意:只处理文件,不处理子目录?或者可以选择递归?这里我们先不递归,只处理指定目录下的文件)2.根据模式生成新文件名。对于后缀模式:我们通常将后缀加在文件名的主体部分(即扩展名之前)。例如:file.txt-> file_suffix.txt序列化模式:将文件重命名为基础名称加上序号,然后保留原扩展名。例如:image_1.txt, image_2.jpg等。替换模式:将文件名中的old_str替换为new_str。注意:在序列化模式中,文件顺序如何?我们默认按原文件名排序(可以按字母顺序,也可以按修改时间等,这里按字母顺序)。为了避免覆盖,如果生成的新文件名已经存在,我们应该如何处理?方案1:在序列号后面加上足够位数的数字(比如固定位数,不足补零),然后按顺序递增,这样冲突的可能性小。方案2:如果发现冲突,在基础名称后面添加一个唯一的数字(但这样可能不连续)。我们这里简单处理:如果冲突,就在序号后面加一个临时标记,然后继续检查,直到不冲突。但考虑到重命名是批量操作,我们可以在序列化时按顺序生成,并且确保不覆盖已有文件(但注意,我们是在同一个目录下,所以如果新文件名已经存在,就会覆盖,这是危险的)。因此,我们不应该直接覆盖,而是先检查新文件名是否存在,如果存在,则跳过(或者给用户提示)?或者我们可以先将要重命名的文件移动到一个临时目录,然后再移动回来?这样太复杂。另一种思路:我们分两步进行,第一步先收集所有的新文件名,如果发现有重复(无论是新文件名之间重复,还是新文件名与已有文件重复),都提示用户并退出。或者,我们可以为每个文件生成一个唯一的新文件名(比如在序列号后面补零到固定位数),但这样用户可能无法控制。为了简单,我们要求用户确保在序列化模式下,基础名称加上序号不会产生重复。我们按顺序生成序号,并且如果新文件名已经存在(即使不是当前要重命名的文件之一),我们也会提示错误并退出。因此,在生成新文件名后,我们会检查新文件名是否已经存在于目标目录(且不是当前文件本身?因为重命名同一个文件时,新文件名等于旧文件名是允许的,但这种情况通常不需要修改)。注意:如果新文件名和旧文件名相同,我们跳过这个文件。步骤:1.获取目录下的所有文件(不包括子目录)。2.根据模式生成新文件名。3.检查新文件名是否已经存在(并且不是当前文件),如果存在则报错(因为不能覆盖)。4.如果没有冲突,则记录更改,然后预览。5.询问用户是否确认执行。代码结构:我们使用argparse来解析参数,但也可以使用交互式输入,不过题目要求写一个文件,所以最好能通过命令行参数配置。但是,由于参数较多且不同模式需要不同的参数,我们可能需要根据模式来检查参数是否提供。由于时间关系,我们写一个简化版本,只支持替换模式、添加前缀和后缀,以及序列化模式。并且序列化模式我们按文件名排序,然后生成连续的序号(固定位数,比如4位,不足补零)。我们决定在序列化模式中,使用固定位数的序号(例如4位),这样如果文件数量超过10000,我们可以自动扩展到5位?或者让用户指定位数?为了简单,我们使用足够长的位数(比如用len(str(文件数量))来确定位数),这样每个序号都是唯一的,且按顺序。具体实现序列化模式:文件数量为n,则位数d= len(str(n)),然后序号从start开始,格式化为d位数字(前面补零)。例如:n=100,start=1,则d=3,第一个文件就是001,第二个002,...,第100个100(但这样100就是三位数,而前面的是001也是三位数,所以统一为3位)。步骤:1.获取文件列表,排序(按什么顺序?我们可以按文件名排序,也可以按修改时间排序,这里按文件名排序)。2.计算需要多少位:d =len(str(len(files)))3.然后遍历文件,生成新文件名:f"{base_name}{str(i).zfill(d)}{ext}"其中,i从start开始,递增。但是,注意:如果文件很多,比如1000个,那么d=4(因为1000是4位数),但这样序号从0001到1000,一共1000个,是4位数。所以,d= len(str(len(files)+start-1))#考虑起始序号,最大序号是start+len(files)-1,所以位数是这个数字的位数。例如:start=1,文件100个,最大序号100,位数3;start=10,文件100个,最大序号109,位数3(109是3位)。但这样计算:d= len(str(start+len(files)-1))实现:由于时间关系,我们写一个脚本,但注意题目要求是写一个Python文件,所以我们将整个逻辑在一个main函数中,并使用argparse。但是,考虑到用户可能没有提供足够的参数,我们可以在交互模式下询问。不过,我们这里按照命令行参数来设计。由于参数较多,我们使用argparse。开始编写代码:注意:我们只修改文件名,不修改目录名,也不处理子目录。另外,我们允许用户通过--recursive参数来处理子目录,但题目没有要求,我们先不做。我们将步骤分解:1.解析命令行参数。2.验证目录存在。3.获取文件列表(过滤掉目录)。4.根据模式生成新文件名列表。5.检查冲突(新文件名是否已经存在,且不是当前文件;或者新文件名在本次重命名中重复)。6.预览并确认。7.执行重命名。注意:在重命名过程中,为了避免覆盖,我们可以先重命名那些不会冲突的文件?但是,由于我们一次性检查了所有新文件名都没有冲突,所以可以一次性重命名。但是,在重命名过程中,如果遇到错误(如权限问题),我们应该回滚?这比较复杂,我们简单处理:遇到错误就停止,并提示用户。由于批量重命名是一个敏感操作,我们一定要谨慎。代码实现如下:</think>以下是一个批量修改文件夹中文件名称的Python脚本,支持多种重命名模式(添加前缀/后缀、替换字符串、序列化命名): ```python import os import argparse def batch_rename(directory, mode, prefix='', suffix='', old_str='', new_str='', base_name='file', start=1, digits=4): """ 批量重命名目录中的文件 :param directory: 目标目录路径 :param mode: 重命名模式 (prefix/suffix/replace/sequence) :param prefix: 前缀文本 (prefix模式使用) :param suffix: 后缀文本 (suffix模式使用) :param old_str: 被替换文本 (replace模式使用) :param new_str: 替换文本 (replace模式使用) :param base_name: 基础名称 (sequence模式使用) :param start: 起始序号 (sequence模式使用) :param digits: 序号位数 (sequence模式使用) """ if not os.path.exists(directory): print(f"错误:目录 '{directory}' 不存在") return files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))] renamed_count = 0 print(f"\n即将重命名 {len(files)} 个文件:") print("-" * 60) for i, filename in enumerate(sorted(files)): name, ext = os.path.splitext(filename) new_name = filename if mode == 'prefix': new_name = f"{prefix}{filename}" elif mode == 'suffix': new_name = f"{name}{suffix}{ext}" elif mode == 'replace': new_name = filename.replace(old_str, new_str) elif mode == 'sequence': seq = str(start + i).zfill(digits) new_name = f"{base_name}_{seq}{ext}" # 跳过无需修改的文件名 if new_name == filename: print(f"[跳过] {filename} -> 名称未变化") continue src = os.path.join(directory, filename) dst = os.path.join(directory, new_name) # 防止文件覆盖 if os.path.exists(dst): print(f"错误:目标文件已存在 '{new_name}',跳过重命名") continue print(f"{filename} -> {new_name}") os.rename(src, dst) renamed_count += 1 print("-" * 60) print(f"操作完成!成功重命名 {renamed_count}/{len(files)} 个文件") if __name__ == "__main__": parser = argparse.ArgumentParser(description='批量文件重命名工具') parser.add_argument('directory', help='目标目录路径') parser.add_argument('-m', '--mode', required=True, choices=['prefix', 'suffix', 'replace', 'sequence'], help='重命名模式: prefix(前缀)/suffix(后缀)/replace(替换)/sequence(序列)') # 模式相关参数 parser.add_argument('-p', '--prefix', default='', help='前缀文本 (prefix模式使用)') parser.add_argument('-s', '--suffix', default='', help='后缀文本 (suffix模式使用)') parser.add_argument('-o', '--old_str', default='', help='被替换文本 (replace模式使用)') parser.add_argument('-n', '--new_str', default='', help='替换文本 (replace模式使用)') parser.add_argument('-b', '--base_name', default='file', help='基础名称 (sequence模式使用)') parser.add_argument('--start', type=int, default=1, help='起始序号 (sequence模式使用)') parser.add_argument('--digits', type=int, default=4, help='序号位数 (sequence模式使用)') args = parser.parse_args() # 执行重命名操作 batch_rename( directory=args.directory, mode=args.mode, prefix=args.prefix, suffix=args.suffix, old_str=args.old_str, new_str=args.new_str, base_name=args.base_name, start=args.start, digits=args.digits ) ``` ### 使用示例: 1. **添加前缀** `python rename.py /path/to/files -m prefix -p "archive_"` 2. **添加后缀** `python rename.py /path/to/files -m suffix -s "_v2"` 3. **替换文本** `python rename.py /path/to/files -m replace -o "oldtext" -n "newtext"` 4. **序列化命名** `python rename.py /path/to/files -m sequence -b "photo" --start 10 --digits 3` ### 功能特点: - 自动检测目录存在性 - 防止文件覆盖冲突 - 显示详细操作日志 - 支持文件名排序后序列化 - 跳过无需修改的文件 - 参数验证和错误处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值