2015-07-07 3 views
0

Написал тесты, которые будут выполнены в моем приложении Python. Тесты сравнивают два файла, ожидаемый результат (статические сохраненные файлы) с результатом (сгенерированный с помощью теста) с использованием файла filecmp от Python. Сначала это сработало отлично. Затем со временем файл прекратил сопоставление, и тесты начали сбой.Нежелательные пробелы Python добавлены в файл

Если я делаю Unix diff, действительно, файлы разные, но строки имеют одинаковый контент. Если я игнорирую пробелы, то есть используйте параметр diff -w, файлы совпадают.

bash-4.1$ diff -w myfile.out ../expected_outcome 

bash-4.1$ diff myfile.out ../expected_outcome | more 
4,6c4,6 
<  "file": "File1", 
<  "name": "Myfile1", 
<  "created": "07/06/2015", 
--- 
>  "file": "File1", 
>  "name": "Myfile1", 
>  "created": "07/06/2015", 

Коллега предложил мне посмотреть на шестигранную моих файлов и сравнить их:

outcome: 
0000040: 7265 7669 7369 6165 2e65 7464 222c 200a Myfile1", . 

expected outcome: 
0000040: 7265 7669 7369 6165 2e65 7464 222c 0a20 Myfile1",. 

=> So you can see the last byte is different between the 
two files, i.e. 200a is not same as 0a20. 

Это, как я сейчас пишу мои результаты в файл:

rv = self.app.get(url) 

with open(output_path1, 'w') as fp: 
    fp.write(rv.data.decode('utf-8')) 

В документах Python было неясно, как запросы возвращают данные. После некоторого «мозгового штурма» с коллегой мы подумали, что это будет связано с использованием json.dump для записи файла с указанием разделителей. К сожалению, я получаю ошибки и был бы признателен, если кто-то может пожалуйста исправить мой синтаксис:

rv = self.app.get(url) 

with open(output_path1, 'w') as fp: 
    data = json.load(rv.data.decode('utf-8')) 
    json.dump(data, indent=4, separators=(',', ':')) 

дает следующее сообщение об ошибке:

AttributeError: 'str' object has no attribute 'read' 
+0

Почему вы используете 'json.load()' в строке? Вы должны использовать 'json.loads()' в этом случае. –

+0

Кроме того, 'json.dump()' принимает объект файла, а также данные для дампа. Вам нужно перейти в 'fp'. –

ответ

0

спасибо за комментарии, да у меня было два опечаток, ниже исправленный код, который работает:

код

rv = self.app.get(url) 
with open(output_path1, 'w') as fp: 
    data = json.loads(rv.data.decode('utf-8')) 
    json.dump(data, fp, indent=2, separators=(', ', ': ')) 
Смежные вопросы