Разобрать файл .strings с помощью Python - PullRequest
1 голос
/ 25 января 2010

Я пытаюсь написать небольшой скрипт на Python для анализа файла .strings в моем проекте приложения iPhone и определения того, какие ключи могут не использоваться. Я также выполняю сопоставление строк, чтобы отфильтровать некоторые результаты. Это где мои проблемы начинаются :). Если я попробую что-то вроде

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

поисковое ключевое слово часто не совпадает, даже если я печатаю каждую строку файла в одной и той же строке, потому что я, кажется, правильно читаю текст, и появляются мои ключевые слова для поиска.

Проблема в том, что эти файлы .strings находятся в каком-то двоичном формате. Кто-нибудь знает, как правильно разобрать эти файлы?

Ответы [ 3 ]

2 голосов
/ 25 января 2010

Используйте правильную кодировку, чтобы открыть файл .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
2 голосов
/ 25 января 2010

Нет опыта работы с этими .strings файлами, но вот причина, по которой вы не находите совпадений:

strings_file.read()

возвращает строку с полным содержимым файла. Итерации по строке итерируются по отдельным символам , т.е. в вашем цикле for file_line не является строкой, это всегда всего один единственный символ (строка длиной 1), который, очевидно, может ' t содержит многосимвольное поисковое слово.

0 голосов
/ 25 января 2010

Похоже, файл укусов был сохранен как данные. Если python не может прочитать его как есть, вы можете преобразовать его в обычный текстовый файл в Objective-c.

Просто: (1) считайте файл строк в файл с правильной кодировкой. (2) Преобразовать в словарь (3) записать словарь в другой файл.

Итак:

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