запись chr (13) в файл дает chr (10) при чтении - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть простой кусок кода, который ломает мне голову:

if __name__ == '__main__':
    writen_text = chr(13)
    file = open('bug', 'w')
    file.write(writen_text)
    file.close()
    file = open('bug')
    read_text = ''.join(file.readlines())
    print([ord(c) for c in writen_text])
    print([ord(c) for c in read_text])
    assert writen_text == read_text

Вывод

[13]
[10]
Traceback (most recent call last):
  File "/bug.py", line 10, in <module>
    assert writen_text == read_text
AssertionError

Что это ???Я просто хочу написать текст в файл и прочитать именно этот текст без каких-либо изменений

Python3.6.6, Ubuntu18.04, если это имеет значение

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Ответ от jk622 был полезен.Чтобы избежать конвертации, я открываю файл в режиме 'rb' и получаю подтверждение:

if __name__ == '__main__':
    writen_text = chr(13)
    file = open('bug', 'w')
    file.write(writen_text)
    file.close()
    file = open('bug', 'rb')
    read_text = file.read()
    assert writen_text == str(read_text, encoding='utf-8')
0 голосов
/ 26 декабря 2018

Если вы заметили, что, начиная с chr(10), он остается прежним и проходит проверку на утверждение.

Таким образом, реальный вопрос заключается в том, почему chr(13) заменяется на chr(10)?Чтобы ответить на этот вопрос, мы должны посмотреть, что на самом деле представляет каждый из этих символов.chr(13) - это символ возврата каретки, а chr(10) - это символ перевода строки.

Вы упомянули, что используете Linux.Linux, использующий модель Unix, использует символ перевода строки и не использует символ возврата каретки в своих файлах.Поэтому при записи символа CR в файл система переводит его в символ LF, используемый системой.Затем вы читаете файл (с переведенным символом) и, таким образом, не подтверждаете свое утверждение.

Вот хороший пост о различиях в типах возвратов.

...