Чтение файла строки Python изменяет формат при добавлении в список.Почему? - PullRequest
0 голосов
/ 23 сентября 2019

Загрузка файла с номерами телефонов, сохраненными в текстовом файле.При печати загруженный файл выглядит хорошо.Запись файла в список.При печати файла из списка получите другой тип кодировки, а не строку.При записи содержимого списка в новый файл получите ненужные \ n и другие символы, несмотря на разбор и обеспечение формата UTF-8.

original_file = open("original.txt", "r", encoding="UTF-8", errors="replace")
pl = []
for item in original_file:
    pl.append(item)
target_file = open("target.txt", "w", encoding="UTF-8")
for item in pl:
    target_file.write(item) # or .write("{}\n".format(item)) 
                            # neither gets me the desired new lin

e

исходное содержимое файла:

(248) 370-0000
(706) 862-2128
(863) 763-8632
(682) 404-0051
(734) 667-2877
...

при загрузке в список pl и печати элемента

for item in pl: print(item)

Я получаюэто:

(248) 370-0000
(706) 862-2128
(863) 763-8632
(682) 404-0051
(734) 667-2877

но когда я просто пишу имя списка pl, я получаю это:

'\ x00 (\ x006 \ x001 \ x000 \ x00) \ x00 \ x003 \ x009 \x002 \ x00- \ x003 \ x001 \ x001 \ x005 \ x00 \ n ',' \ x00 (\ x002 \ x001 \ x004 \ x00) \ x00 \ x009 \ x004 \ x001 \ x00- \ x003 \ x008 \ x004 \ x001\ x00 \ n ',' \ x00 (\ x003 \ x000 \ x004 \ x00) \ x00 \ x002 \ x001 \ x006 \ x00- \ x002 \ x000 \ x009 \ x006 \ x00 \ n ',' \ x00 (\ x007\ x002 \ x004 \ x00) \ x00 \ x003 \ x003 \ x007 \ x00- \ x003 \ x005 \ x000 \ x004 \ x00 \ n ',' \ x00 (\ x002 \ x004 \ x008 \ x00) \ x00 \ x003 \x007 \ x000 \ x00- \ x000 \ x000 \ x000 \ x000 \ x00 \ n ',' \ x00 (\ x007 \ x000 \ x006 \ x00) \ x00 \ x008 \ x006 \ x002 \ x00- \ x002 \ x001 \ x002\ x008 \ x00 \ n ',' \ x00 (\ x008 \ x006 \ x003 \ x00) \ x00 \ x007 \ x006 \ x003 \ x00- \ x008 \ x006 \ x003 \ x002 \ x00 \ n ',' \ x00 (\ x006 \ x008 \ x002 \ x00) \ x00 \ x004 \ x000 \ x004 \ x00- \ x000 \ x000 \ x005 \ x001 \ x00 \ n ',' \ x00 (\ x007 \ x003 \ x004 \ x00) \ x00 \x006 \ x006 \ x007 \ x00- \ x002 \ x008 \ x007 \ x007 \ x00 ']

И я поднимаю это, потому что тамЗатем я пытаюсь загрузить элементы из pl и записать их в целевой файл вместо того, чтобы получить список номеров телефонов в новом текстовом файле. Я получаю следующее:

�3�9�2�-�3�1�1�5�� (�2�1�4�) � �9�4�1�-�3�8�4�1�� (�3�0�4�) � �2�1�6�-�2�0�9�6�� (�7�2�4�) � �3�3�7�-�3�5�0�4�� (�2�4�8�) � �3�7�0�-�0�0�0�0�� (�7�0�6�) � �8�6�2�-�2�1�2�8�� (�8�6�3�) � �7�6�3�-�8�6�3�2�� (�6�8�2�) � �4�0�4�-�0�0�5�1�� (�7�3�4�) � �6�6�7�-�2�8�7�7�

Нет новых строк.Вместо этого пробелы между элементами.

1 Ответ

1 голос
/ 23 сентября 2019

Ваш исходный файл закодирован как UTF-16, с прямым порядком байтов.

>>> bs = b'\x00(\x006\x001\x000\x00)\x00 \x003\x009\x002\x00-\x003\x001\x001\x005\x00\n'
>>> bs.decode('utf-8')
'\x00(\x006\x001\x000\x00)\x00 \x003\x009\x002\x00-\x003\x001\x001\x005\x00\n'
>>> bs.decode('utf-16-be')
'(610) 392-3115\n'

(Наличие нулевого байта b'\x00' перед каждым символом ascii является сильным намеком на то, что utf-16 является кодировкой)

Открытие файла следующим образом должно работать:

original_file = open("original.txt", "r", encoding="utf-16-be")
...