Як читати текстовий файл у змінну рядка та обтягувати нові рядки?


962

Я використовую наступний сегмент коду для читання файлу в 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
Джонатан Судіман

Відповіді:


1317

Ви можете використовувати:

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

66
Чи є недолік просто писати open("data.txt").read().replace('\n','')замість цього?
tuomassalo

262
Так, ваша версія не закриває файл явно, який потім буде відкладений до запуску сміттєзбірника або припинення програми. Оператор "з", як правило, включає в себе деякі налаштування / закриття відкритих / закритих дій.
безсонник

12
Дякуємо за роз’яснення. Так, здається, що для моїх версій для невеликих сценаріїв може бути нормально, але OTOH, бажано, уникати взагалі, щоб не зробити це звичкою.
tuomassalo

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

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

630

Використовуйте read(), а не readline():

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

6
Можливо, але це не знімає нові рядки так, як хотіла ОП. Мені все одно подобається.
Кухар Рендалл

60
Якщо ви повертаєте один рядок, знімати нові рядки не має жодного сенсу - ОП повинен вибрати один рядок або позбавлений \ n із рядків у списку.
Алекс Дюпюй

Працює, але не файли Unicode. Щоб підтримати utf8 на python3, використовуйте додатковий аргументencoding="utf-8"
FindOutIslamNow

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

66

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

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
@Titou проблема полягає в тому, що 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
Arayan Singh

Вам може знадобитися вказати кодування символів.
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()])

зменшити (лямбда x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") набагато прохолодніше: D
Sleplessnerd

3
@Duncan, що б ти запропонував?
Кріс Еберле

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

вихід пітона

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) ]


1

Я не відчуваю, що хтось звертався до [] частини вашого запитання. Коли ви читаєте кожен рядок у своїй змінній, оскільки перед тим, як замінити \ n на ", було кілька рядків, ви в кінцевому підсумку створили список. Якщо у вас є змінна x та роздрукуйте її просто

х

або роздрукувати (x)

або str (x)

Ви побачите весь список із дужками. Якщо ви називаєте кожен елемент (масив сортів)

x [0], тоді він опускає дужки. Якщо ви використовуєте функцію str (), ви побачите лише дані, а не ''. str (x [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/An yearJointHardware

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


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]

Цей код допоможе вам прочитати перший рядок, а потім, скориставшись опцією списку та розділення, ви можете перетворити слово першого рядка, розділене пробілом, яке зберігатиметься у списку.

Тоді ви можете легко отримати доступ до будь-якого слова або навіть зберегти його в рядку.

Те ж саме можна зробити і за допомогою циклу.


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.