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

964

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

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

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

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

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

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

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

klijo
источник
7
Название и вопрос противоречивы. Вы действительно хотите избавиться от \ n, а?
Джулиан
2
Вы действительно хотите удалить символы новой строки из содержимого файла / строки, или вы просто запутались во многих метасимволах в выводе на печать и хотите сохранить символы новой строки, но не отображать их как "\ n"?
Mnagel
11
Для тех, кто приходит сюда из поисковой системы, вы, вероятно, ищете ответ @ xiaoyu
Джонатан Судиаман,

Ответы:

1323

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

with open('data.txt', 'r') as file:
    data = file.read().replace('\n', '')
sleeplessnerd
источник
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]) 
CONvid19
источник
Это дает 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 () без аргументов обрежет пробелы, включая переводы строк, с конца строк.

MagerValp
источник
12

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

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

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

text_as_string = open('Your_Text_File.txt').read()
Loochie
источник
9

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

with open("myfile.txt") as f:
    file_content = f.read().rstrip("\n")
    print file_content
whirlwin
источник
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
hungneox
источник
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) ]
gerardw
источник
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)

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

Alex
источник
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
PyGuy
источник
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

Палак джайн
источник