Как прочитать текстовый файл в строковую переменную и удалить символы новой строки?


964

Я использую следующий сегмент кода для чтения файла в Python:

with open ("data.txt", "r") as myfile:
    data=myfile.readlines()

Входной файл:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

и когда я печатаю данные, я получаю

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Как я вижу данные в listформе. Как сделать строку? А также как я удалить "\n", "["и "]"символы из него?



7
Название и вопрос противоречивы. Вы действительно хотите избавиться от \ n, а?
Джулиан

2
Вы действительно хотите удалить символы новой строки из содержимого файла / строки, или вы просто запутались во многих метасимволах в выводе на печать и хотите сохранить символы новой строки, но не отображать их как "\ n"?
Mnagel

11
Для тех, кто приходит сюда из поисковой системы, вы, вероятно, ищете ответ @ xiaoyu
Джонатан Судиаман,

Ответы:


1323

Вы можете использовать:

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')

67
Есть ли недостаток в том, чтобы просто писать open("data.txt").read().replace('\n','')?
Туомассало

263
Да, ваша версия явно не закрывает файл, который будет отложен до запуска сборщика мусора или завершения работы программы. Оператор 'with' обычно инкапсулирует некоторые действия установки / разрыва открытия / закрытия.
sleeplessnerd

12
Благодарю за разъяснение. Таким образом, кажется, что моя версия может быть подходящей для небольших сценариев - но OTOH желательно избегать вообще, чтобы не сделать ее привычкой.
Туомассало

10
@tuomassalo - это огромный PITA в процессе тестирования / отладки, так как он не будет очищать дескрипторы открытых файлов, если вам придется преждевременно завершить работу или возникнет исключение.
GoingTharn

13
Нет, rstrip('\n')удалит только новую строку из последней строки, replace('\n','')удалит ее везде (по сути, сделав весь файл одной строкой)
sleeplessnerd

632

Используйте read(), а не readline():

with open('data.txt', 'r') as myfile:
  data = myfile.read()

6
Возможно, но это не лишает новых строк, как того хотел ОП. Мне все еще нравится это все же.
Рэндалл Кук

60
Если вы возвращаете одну строку, разбор строк не имеет никакого смысла - OP должен выбрать одну строку или раздел \ n из строк в списке.
Алекс Дюпюи

Работает, но не Unicode файлы. Для поддержки utf8 на python3 используйте дополнительный аргументencoding="utf-8"
FindOutIslamNow

2
Я не понимаю, почему это решение было опубликовано, и оно также получает так много голосов. В основном это то же самое, что было принято более года назад, и даже отсутствует новая часть для зачистки линий, что делает это еще менее полезным ..
nnsense

65

Вы можете прочитать из файла в одну строку:

str = open('very_Important.txt', 'r').read()

Обратите внимание, что это не закрывает файл явно.

CPython закроет файл, когда он выйдет как часть сборки мусора.

Но другие реализации Python не будут. Чтобы написать переносимый код, лучше withявно использовать или закрыть файл. Короткая не всегда лучше. См. Https://stackoverflow.com/a/7396043/362951.


32
Это анти-идиоматическое и не рекомендуется. openдолжны быть использованы в with ... asзаявлении.
Хорхе Лейтао

1
@JC можешь объяснить проблему? Это просто вопрос обычаев или with ... asутверждение приносит что-то?
Титу

4
@ Дело в том, что open.read () не закрывает файл, поэтому нам нужно with ... asили str.close()как показано в ответе Педро. Подробнее о важности закрытия файлов здесь
JBallin

@JBallin. Эта идиома явно устраняет источник ошибки. Спасибо !
Титу

3
это также плохо, потому что вы только что str()
скрылись

50

Чтобы объединить все строки в строку и удалить новые строки, я обычно использую:

with open('t.txt') as f:
  s = " ".join([x.strip() for x in f]) 

Это дает UnicodeDecodeError в моем коде. Смотрите этот stackoverflow.com/q/18649512/9339242
Арайан Сингх

вам может понадобиться указать кодировку символов.
CONvid19,

45

В Python 3.5 или более поздней версии , используя pathlib, вы можете скопировать содержимое текстового файла в переменную и закрыть файл в одну строку:

from pathlib import Path
txt = Path('data.txt').read_text()

и затем вы можете использовать str.replace для удаления новых строк:

txt = txt.replace('\n', '')

31
with open("data.txt") as myfile:
    data="".join(line.rstrip() for line in myfile)

Функция join () присоединится к списку строк, а функция rstrip () без аргументов обрежет пробелы, включая переводы строк, с конца строк.


12

Это можно сделать с помощью метода read ():

text_as_string = open('Your_Text_File.txt', 'r').read()

Или, поскольку сам режим по умолчанию - 'r' (чтение), просто используйте,

text_as_string = open('Your_Text_File.txt').read()

9

Я возился с этим некоторое время и предпочел использовать readв сочетании с rstrip. Без rstrip("\n"), Python добавляет новую строку в конец строки, что в большинстве случаев не очень полезно.

with open("myfile.txt") as f:
    file_content = f.read().rstrip("\n")
    print file_content

6

Трудно точно сказать, что вы ищете, но что-то вроде этого должно помочь вам начать:

with open ("data.txt", "r") as myfile:
    data = ' '.join([line.replace('\n', '') for line in myfile.readlines()])

Reduce (лямбда x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") намного круче: D
sleeplessnerd

3
@ Дункан, что бы вы предложили?
Крис Эберле

data = ' '.join(line.replace('\n', '') for line in myfile)или версия MagerValp.
Дункан

6

Я удивлен, что никто splitlines()еще не упомянул .

with open ("data.txt", "r") as myfile:
    data = myfile.read().splitlines()

Переменная dataтеперь является списком, который выглядит следующим образом при печати:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Обратите внимание, что нет новых строк (\n ).

В этот момент звучит так, как будто вы хотите вывести обратно строки на консоль, чего можно добиться с помощью цикла for:

for line in data:
    print line

4

Вы также можете раздеть каждую строку и объединить в окончательную строку.

myfile = open("data.txt","r")
data = ""
lines = myfile.readlines()
for line in lines:
    data = data + line.strip();

Это также сработает.


Спасибо Педро. Я просто добавил это ради понимания.
Саи Кирити Бадам

3

Вы можете сжать это в одну в две строки кода !!!

content = open('filepath','r').read().replace('\n',' ')
print(content)

если ваш файл читает:

hello how are you?
who are you?
blank blank

выход Python

hello how are you? who are you? blank blank

3

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

_ = open('data.txt', 'r'); data = _.read(); _.close()

2
f = open('data.txt','r')
string = ""
while 1:
    line = f.readline()
    if not line:break
    string += line

f.close()


print string

2
Петли, которые есть, string += lineследует избегать. Некоторым версиям Python здесь удается избежать поведения O (n ^ 2), но любые другие ответы, которые были даны, лучше этого. Также вы не удалили запрошенные строки, поэтому ваш код - очень медленный способstring = f.read()
Duncan

Спасибо, что поправили меня. Но одна маленькая вещь заключается в том, что мне не нужно удалять новую строку, потому что при тестировании она не выводила '\ n'. @Duncan
Hungneox

2

python3: Google "составление списка", если синтаксис квадратной скобки является новым для вас.

 with open('data.txt') as f:
     lines = [ line.strip( ) for line in list(f) ]

2

Вы пробовали это?

x = "yourfilename.txt"
y = open(x, 'r').read()

print(y)

1
Это не верно. Вы хотите, чтобы y = open (x, 'r'). Read (), если вы собираетесь сделать это таким образом.
Katastic Voyage

1

Я не чувствую, что кто-то ответил на [] часть вашего вопроса. Когда вы читаете каждую строку в вашей переменной, потому что до того, как вы заменили \ n на '', было несколько строк, вы в итоге создали список. Если у вас есть переменная х и распечатать его просто

Икс

или распечатать (х)

или ул (х)

Вы увидите весь список в скобках. Если вы называете каждый элемент (массив сортов)

x [0], тогда он пропускает скобки. Если вы используете функцию str (), вы увидите только данные, а не ''. ул (х [0])


1

Может быть, вы могли бы попробовать это? Я использую это в своих программах.

Data= open ('data.txt', 'r')
data = Data.readlines()
for i in range(len(data)):
    data[i] = data[i].strip()+ ' '
data = ''.join(data).strip()

1

Регулярное выражение тоже работает:

import re
with open("depression.txt") as f:
     l = re.split(' ', re.sub('\n',' ', f.read()))[:-1]

print (l)

[«Я», «чувствую», «пусто», «и», «мертв», «внутри»]


1

Для удаления разрывов строк с помощью Python вы можете использовать replaceфункцию строки.

В этом примере удаляются все 3 типа разрывов строк:

my_string = open('lala.json').read()
print(my_string)

my_string = my_string.replace("\r","").replace("\n","")
print(my_string)

Пример файла:

{
  "lala": "lulu",
  "foo": "bar"
}

Вы можете попробовать это, используя этот сценарий воспроизведения:

https://repl.it/repls/AnnualJointHardware

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


0

Это работает: измените ваш файл на:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Затем:

file = open("file.txt")
line = file.read()
words = line.split()

Это создает список с именем words, равным:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Это избавилось от "\ n". Чтобы ответить на часть о скобках, мешающих вам, просто сделайте это:

for word in words: # Assuming words is the list above
    print word # Prints each word in file on a different line

Или:

print words[0] + ",", words[1] # Note that the "+" symbol indicates no spaces
#The comma not in parentheses indicates a space

Это возвращает:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

1
Изменение файла может работать в одноразовой ситуации, но если у вас есть сотни файлов, это просто нереальное решение.
Craicerjack

0
with open(player_name, 'r') as myfile:
 data=myfile.readline()
 list=data.split(" ")
 word=list[0]

Этот код поможет вам прочитать первую строку, а затем, используя опцию list и split, вы можете преобразовать слово первой строки, разделенное пробелом, для сохранения в списке.

Чем вы можете легко получить доступ к любому слову или даже сохранить его в строке.

Вы также можете сделать то же самое с помощью цикла for.


0
file = open("myfile.txt", "r")
lines = file.readlines()
str = ''                                     #string declaration

for i in range(len(lines)):
    str += lines[i].rstrip('\n') + ' '

print str

-1

Попробуйте следующее:

with open('data.txt', 'r') as myfile:
    data = myfile.read()

    sentences = data.split('\\n')
    for sentence in sentences:
        print(sentence)

Внимание: не удаляет \n. Это просто для просмотра текста, как будто не было\n

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.