Строка чтения Python с настраиваемым разделителем

новичок здесь. Я пытаюсь прочитать строки из файла, однако одна строка в файле .txt имеет где-то посередине \n, и при попытке прочитать эту строку с помощью .readline python обрезает ее посередине и выводит как две строки.

  • когда я копирую и вставляю строку в это окно, она отображается как две строки. Поэтому я загрузил файл сюда: https://ufile.io/npt3n

  • также добавлен скриншот файла, как он показывает в файле txt.

  • это история группового чата, экспортированная из Whatsup... если вам интересно.
  • Пожалуйста, помогите мне полностью прочитать одну строку, как показано в текстовом файле.

.

f= open("f.txt",mode='r',encoding='utf8')

for i in range(4):
    lineText=f.readline()
    print(lineText)

f.close()

введите описание изображения здесь


person hgv    schedule 23.08.2018    source источник
comment
Как строка может иметь \n посередине? \n — это то, что отделяет каждую строку от следующей.   -  person khelwood    schedule 23.08.2018
comment
@khelwood не в Windows. Это зависит от ОС.   -  person simon    schedule 23.08.2018
comment
Python распознает \n как маркер строки. Однако Windows использует \r\n, поэтому просто \n не разделяет строку, например. Блокнот. Возможно, вам поможет этот вопрос.   -  person joH1    schedule 23.08.2018
comment
Я думаю, это потому, что в предложении есть «символ следующей строки». Возможно, человек в чате ввел текст «Коджаэли 24...» с новой строки. Но файл в моей системе по умолчанию показывает его в другой строке в блокноте ++. Так что, возможно, это проблема с блокнотом.   -  person kkblue    schedule 23.08.2018
comment
Python имеет универсальную поддержку новых строк. В основном все \n, \r и \n\r считаются новой строкой. Если вы откроете файл в текстовом режиме, Python преобразует эти 3 конца строки только в \n. Если вам нужно интерпретировать текст по-другому, вы хотите открыть файл в двоичном режиме и обрабатывать строки вручную.   -  person Giacomo Alzetta    schedule 23.08.2018


Ответы (2)


Python 3 позволяет вам определить, что является новой строкой для конкретного файла. Он используется редко, потому что режим универсальных переводов строк по умолчанию очень терпим:

При чтении ввода из потока, если для новой строки установлено значение «Нет», включается режим универсальной новой строки. Строки во входных данных могут заканчиваться на '\n', '\r' или '\r\n', и они преобразуются в '\n' перед возвратом вызывающей стороне.

Итак, здесь вы должны явно указать, что только '\r\n' является концом строки:

f= open("f.txt",mode='r',encoding='utf8', newline='\r\n')

# use enumerate to show that second line is read as a whole
for i, line in enumerate(fd):   
    print(i, line)
person Serge Ballesta    schedule 23.08.2018
comment
Это может быть один из None, '', '\n', '\r' и '\r\n'. Я попытался указать /›\n для XML-файла, который у меня был, и он дал мне ValueError: недопустимое значение новой строки. Файл слишком велик, чтобы поместиться в памяти при полном чтении, поэтому я не могу это сделать и разделить. И из миллионов строк, которые у меня есть, у одной обязательно будет плохой \n вместо правильного \\n, поскольку данные имеют свободное текстовое поле, которое экранируется двойными кавычками. В худшем случае эта строка и бедный сосед будут повреждены, поскольку я использую регулярное выражение и удаляю строку, если она повреждена. Меня беспокоит эта бедная соседняя линия. - person devssh; 27.09.2018
comment
@devssh: это другой вопрос. Я бы прочитал строки со стандартным значением новой строки (None) и объединил их, если последний символ не является "\>". Но в любом случае использование регулярных выражений для XML, как правило, является плохим решением. Кстати, xml.sax можно использовать для обработки XML-файла без загрузки всего в память... - person Serge Ballesta; 27.09.2018
comment
Ааа, такая хорошая идиома была бы для хранения нескольких JSON в одном файле для потокового синтаксического анализа! Вселенная садистка. - person ogurets; 24.10.2019
comment
Следует отметить, что единственными допустимыми значениями для аргумента newline являются None, '', '\n', '\r' и '\r\n'. Это может вас укусить, если строки в вашем файле разделены одним из различных символов новой строки Unicode. - person Jeyekomon; 05.03.2021

Вместо использования функции readline вы можете читать весь контент и разделять строки по регулярному выражению:

import re

with open("txt", "r") as f:
    content = f.read()
    # remove end line characters
    content = content.replace("\n", "")
    # split by lines
    lines = re.compile("(\[[0-9//, :\]]+)").split(content)
    # clean "" elements
    lines = [x for x in lines if x != ""]
# join by pairs
lines = [i + j for i, j in zip(lines[::2], lines[1::2])]

Если весь контент имеет одинаковое начало [...], вы можете разделить его, а затем очистить все части, опуская элементы "". Затем вы можете соединить каждую часть с помощью функции zip (https://stackoverflow.com/a/5851033/1038301)

person Roomm    schedule 23.08.2018
comment
Как указано в комментарии (после вашего ответа), файл слишком велик, чтобы поместиться в памяти. - person Stéphane Gourichon; 12.07.2020