自定义文件转JSON遇问题:代码执行后文件内容丢失求助
自定义格式转JSON的问题与解决方案
问题背景
我需要将一种自定义格式的文件转换为JSON格式以便编辑,自定义格式示例如下:
{ "#letter_a" "A" "#letter_b" "B" "#letter_c" "C" "#letter_d" "D" "#letter_e" "E" "#letter_f" "F" "#letter_g" "G" "#letter_h" "H" "#letter_i" "I" "#letter_j" "J" "#letter_k" "K" "#letter_l" "L" "#letter_m" "M" }
目标是给每个键末尾添加冒号,行末添加逗号(最后一行除外),我尝试了以下代码:
import in_place with in_place.InPlace('english_m.lang', encoding="utf-8", backup='.bak') as file: for line in file: cumle = line.join(line.split('"', 2)[:2]) print(line.replace(cumle, cumle+'":'), end='')
但执行后文件内容全部丢失,请问如何解决该问题,或是否有直接转JSON的方法?
问题原因
你用print()输出到了控制台,而非写入in_place库的文件对象中。in_place.InPlace会先清空原文件,等待写入修改后的内容,由于没有向文件写入任何内容,最终文件被清空。
解决方案
方案一:修复原代码,正确使用in_place库
修改代码,将内容写入文件对象而非控制台:
import in_place with in_place.InPlace('english_m.lang', encoding="utf-8", backup='.bak') as file: lines = list(file) total_lines = len(lines) for idx, line in enumerate(lines): stripped_line = line.strip() # 跳过首尾大括号行 if stripped_line in ('{', '}'): file.write(line) continue # 处理键值行:在键后加冒号,行末加逗号(最后一个键值对除外) parts = line.split('"', 2) if len(parts) >= 3: modified_line = f'{parts[0]}"{parts[1]}": {parts[2].rstrip()}' # 倒数第二行是最后一个键值对,后面是闭合大括号,不加逗号 if idx != total_lines - 2: modified_line += ',' modified_line += '\n' file.write(modified_line)
方案二:直接解析为JSON结构再写入(更稳妥)
先读取文件解析成Python字典,再直接转为标准JSON写入,避免手动处理格式细节:
import json def parse_custom_format(file_path): data = {} with open(file_path, 'r', encoding='utf-8') as f: for line in f: stripped = line.strip() if stripped in ('{', '}'): continue # 分割键和值 key_part, value_part = stripped.split('" "') key = key_part.strip('"') value = value_part.strip('"') data[key] = value return data # 解析自定义格式文件 lang_data = parse_custom_format('english_m.lang') # 写入标准JSON文件 with open('english_m.json', 'w', encoding='utf-8') as f: json.dump(lang_data, f, indent=4, ensure_ascii=False)
执行后生成的JSON文件内容如下:
{ "#letter_a": "A", "#letter_b": "B", "#letter_c": "C", "#letter_d": "D", "#letter_e": "E", "#letter_f": "F", "#letter_g": "G", "#letter_h": "H", "#letter_i": "I", "#letter_j": "J", "#letter_k": "K", "#letter_l": "L", "#letter_m": "M" }
内容的提问来源于stack exchange,提问作者CidQu
相关产品推荐
相关产品推荐

