Python写入文件时文件名大小写不敏感?原因及解决方法
字典键仅大小写差异时,写入文件只生成一个文件的问题及解决
问题描述
我有一个字典,希望将字典的值写入以键为名称基础的文件,字典的键仅存在大小写差异(如'g.XXXXX'和'G.XXXXX')。执行以下代码:
dict_1 = {'g.XXXXX': '>g|XXXXX|1\nSRGSSAGFDRHITIFSPEGRLYQVEYAFKAINQGGLTSVAVRGKDCA', 'G.XXXXX': '>G|XXXXX|1\nSAGFDRHITIFSPEGRLYQVEYAFKAINQGGLTSVAVRGKDCAVIVTQKKVPDKLLDSSTVTHL'} for k in dict_1: with open(f'{k}.data.txt', 'w') as out: out.write(f'{dict_1[k]}\n')
执行后脚本仅生成了'g.XXXXX.data.txt'文件,且文件内容为'G.XXXXX'对应的值,而非生成两个分别对应各自键值的文件。
原因分析
核心问题在于你使用的文件系统是大小写不敏感的(比如Windows NTFS、默认配置的macOS APFS)。这类文件系统会把g.XXXXX.data.txt和G.XXXXX.data.txt判定为同一个文件路径。加上Python 3.7及以后的字典是按插入顺序遍历的,你的字典中G.XXXXX在g.XXXXX之后,后者的写入操作会直接覆盖前者的文件内容,最终看起来只生成了一个文件,且内容是后一个键的值。
解决方法
方法1:修改文件名确保唯一性
通过给文件名添加额外标识,让大小写不同的键对应不同的文件。比如根据键的大小写状态添加后缀:
dict_1 = {'g.XXXXX': '>g|XXXXX|1\nSRGSSAGFDRHITIFSPEGRLYQVEYAFKAINQGGLTSVAVRGKDCA', 'G.XXXXX': '>G|XXXXX|1\nSAGFDRHITIFSPEGRLYQVEYAFKAINQGGLTSVAVRGKDCAVIVTQKKVPDKLLDSSTVTHL'} for k in dict_1: # 根据键的大小写添加区分标识 if k.islower(): filename = f"{k}_lower.data.txt" elif k.isupper(): filename = f"{k}_upper.data.txt" else: # 混合大小写的情况可以自定义规则,比如保留原键+哈希值 filename = f"{k}_{hash(k)}.data.txt" with open(filename, 'w') as out: out.write(dict_1[k])
也可以直接将键的大小写信息编码到文件名中,比如用前缀lower_或upper_,确保每个键对应唯一的文件。
方法2:启用文件系统的大小写敏感(仅特定系统适用)
如果你的操作系统支持(比如Linux的ext4天然支持,macOS可以创建大小写敏感的APFS分区),可以调整文件系统的设置来支持大小写区分的文件名。但这种方式需要系统级操作,不适合作为跨平台的通用解决方案。
内容的提问来源于stack exchange,提问作者Fan
相关产品推荐
相关产品推荐

