Python чтение файла в 2-й список - новая строка = Нет vs полоса ("\ r \ n") - PullRequest
0 голосов
/ 09 июля 2020

РЕДАКТИРОВАТЬ: bigbounty запросил образцы данных. Я не уверен, как сохранить новые строки при вставке здесь, поэтому вместо этого предоставил изображение. См. Ниже.

Я пытаюсь определить правильный и наиболее c способ Pythoni для удаления новых строк при чтении данных из вечного файла в 2-мерный список. У меня проблемы с определением того, что делает newline в open() (и да, я проверил документы - мне все еще не удалось щелкнуть). Является ли приведенный ниже код правильным способом чтения данных в 2-мерный список, избегая захвата символов новой строки? Является ли какая-либо его часть избыточной (например, newline=None?)

РЕДАКТИРОВАТЬ: Я использую windows, но ищу кроссплатформенное решение.

with open(file_name, "r", newline=None) as fh:
    list_2d = [[char for char in line.strip("\r\n")] for line in fh]

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

Ответы [ 5 ]

2 голосов
/ 14 июля 2020

Если вы хотите быть совместимым со всеми платформами, вы можете открыть режим wrt 'rU', который открывает ваш файл в режиме Универсальный перевод строки , и тогда каждое вхождение новой строки будет отображаться как символ '\n' (так тогда вам нужно только посчитать '\n' символов). Поскольку Python 3, устарел , режим 'rU' равен newline=None, что означает, что фрагмент кода является кроссплатформенным c.

list_2d = []
with open(file_name, newline=None) as fh:
     list_2d.append([x for x in line.split("\n")])

Нет необходимо использовать спецификатор 'r', если вы просто wi sh для чтения, потому что это уже аргумент по умолчанию.

2 голосов
/ 14 июля 2020

Если вы не против чтения всего файла в память за один go (что, кажется, вы не возражаете, поскольку вы потребляете весь файл и помещаете его в список), вы можно использовать lines = file.read().splitlines(), что будет списком строк, где каждая строка представляет собой одну строку (без завершающих символов возврата каретки или новой строки).

1 голос
/ 14 июля 2020

Не нужно упоминать.

  1. Режим только для чтения, по умолчанию.
  2. newLine = None, по умолчанию.
with open(file_name) as fh:
    list_2d = [[char for char in line if char != "\n"] for line in fh]
1 голос
/ 09 июля 2020

Только не помещайте \ n char в список.

with open('a.txt', "r") as fh:
    list_2d = [[char for char in line if char!='\n'] for line in fh]
0 голосов
/ 19 июля 2020

Аргумент newline для open включает универсальный режим новой строки , если это None или ''. Разница между ними в том, что None также переводит символы новой строки в \n при чтении файла (и переводит их обратно, если файл записан), в то время как '' не выполняет этот перевод.

Таким образом, если вы используете open с newline=None, вы можете ожидать, что любая строка, заканчивающаяся в файле, будет возвращена вам как \n, на какой бы платформе вы ни работали.

Поскольку newline=None является значением по умолчанию (аналогично, по умолчанию используется текстовый режим). Ваш пример может быть записан для любой платформы как:

with open(file_name) as fh:
    list_2d = [[char for char in line.strip("\n")] for line in fh]
...