用Python解析.strings文件

2 投票
3 回答
2345 浏览
提问于 2025-04-15 18:26

我正在尝试写一个小的Python脚本,用来解析我iPhone应用项目中的.strings文件,看看哪些键可能没有被使用。同时,我还在做一些字符串匹配,以过滤掉一些结果。这就是我遇到问题的地方:)。如果我尝试像这样做

for file_line in strings_file:    
    if 'search_keyword' in file_line:
        ...

搜索关键词经常无法匹配,尽管如果我在同一个循环中打印每一行文件内容,似乎可以正确读取文本,而且我的搜索关键词也能显示出来。

问题是这些.strings文件是以某种二进制格式存储的。有没有人知道有什么好的方法来解析这些文件?

3 个回答

0

听起来这个字符串文件是以数据的形式保存的。如果Python无法直接读取这个文件,你可以在Objective-C中把它转换成一个普通的文本文件。

具体步骤是: (1) 先把字符串文件读取到一个正确编码的文件中。 (2) 然后把它转换成字典。 (3) 最后把这个字典写入另一个文件。

所以:

NSString *strings=[NSString stringWithContentsOfFile:filePath encoding:NSUTF16StringEncoding error:&error];
NSDictionary *dict=[strings propertyList];
[dict writeToFile:anotherFilePath atomically:NO]; 
2

我对那些 .strings 文件没有经验,不过我可以告诉你为什么你找不到匹配的内容:

strings_file.read()

这个代码会返回一个包含文件全部内容的 字符串。当你遍历一个字符串时,其实是在一个个字符地遍历,也就是说在你的 for 循环中,file_line 不是一整行,而始终只是一个单独的字符(长度为1的字符串),显然这样是无法包含多个字符组成的搜索词的。

3

打开 .strings 文件时,要使用正确的编码方式,并在你的 源代码 中也要这样做。根据 文档 的说明,你的文件编码可能是 utf-16。

# -*- coding: utf-8 -*-
import codecs

for line in codecs.open(u'your_file.strings', encoding='utf-16'):
    if u'keyword' in line:
       # process line

撰写回答