Bir metin dosyasını dize değişkenine nasıl okuyabilir ve satır satırlarını nasıl çıkarabilirim?


963

Python bir dosyayı okumak için aşağıdaki kod segmentini kullanın:

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

Girdi dosyası:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

ve veri yazdırdığımda

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Gördüğüm gibi veriler listformda. Nasıl dize yapabilirim? Ve ayrıca nasıl silerim "\n", "["ve "]"ondan karakterleri?



7
Başlık ve soru tutarsız. Gerçekten \ n'den de kurtulmak istiyor musunuz?
Julian

2
gerçekten dosya / dize içeriğinden yeni satırları kaldırmak istiyor musunuz, yoksa sadece baskı çıktısındaki birçok meta karakterle ilgili kafanız mı karışıyor ve yeni satırları korumak mı istiyorsunuz, ancak "\ n" olarak gösterilmiyorlar mı?
mnagel

11
Buraya bir arama motorundan gelenlere muhtemelen @ xiaoyu'nun cevabını arıyorsunuz
Jonathan Sudiaman

Yanıtlar:


1320

Kullanabilirsin:

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

66
open("data.txt").read().replace('\n','')Bunun yerine sadece yazmanın bir dezavantajı var mı ?
tuomassalo

262
Evet, sürümünüz dosyayı açıkça kapatmaz, çöp toplayıcı çalışana veya program sonlanıncaya kadar geciktirilir. 'With' ifadesi genellikle bazı kurulum / sökme açma / kapama eylemlerini içerir.
sleeplessnerd

12
Açıklama için teşekkürler. Bu yüzden, sürümüm küçük komut dosyaları için iyi olabilir - ancak OTOH'u alışkanlık haline getirmemek için tamamen kaçınılmalıdır.
tuomassalo

10
@tuomassalo test / hata ayıklama işleminde büyük bir PITA'dır, çünkü erken sonlandırmak zorunda kalırsanız veya bir istisnada çalışırsa açık dosya tanıtıcılarını temizlemez.
GoingTharn

13
Hayır, rstrip('\n')yeni satırı yalnızca son satırdan replace('\n','')kaldırır, her yerden kaldırır (aslında tüm dosyayı bir satır yapar)
sleeplessnerd

631

Kullanmayın read(), değil readline():

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

6
Belki de, OP'nin istediği gibi yeni satırları çıkarmaz. Yine de hoşuma gidiyor.
Randall Cook

60
Tek bir dize döndürüyorsanız, yeni satırları soymanın bir anlamı yoktur - OP listedeki dizelerden bir dize veya soyulmuş \ n seçmelidir.
Alex Dupuy

Unicode dosyaları çalışır, ancak çalışmaz. Python3 üzerinde utf8'i desteklemek için fazladan bir argüman kullanınencoding="utf-8"
FindOutIslamNow

2
Bu çözümün neden gönderildiğini anlayamıyorum ve aynı zamanda bu kadar çok oy alıyor. Temelde bir yıl önce kabul
edilenle aynıdır

65

Bir satırdaki bir dosyadan okuyabilirsiniz:

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

Bunun dosyayı açıkça kapatmadığını lütfen unutmayın.

CPython, çöp toplama işleminin bir parçası olarak çıktığında dosyayı kapatır.

Ama diğer python uygulamaları olmayacak. Taşınabilir kod yazmak withiçin dosyayı açıkça kullanmak veya kapatmak daha iyidir . Kısa her zaman daha iyi değildir. Bkz. Https://stackoverflow.com/a/7396043/362951


32
Bu anti-deyimseldir ve önerilmez. openbir with ... asifade içinde kullanılmalıdır .
Jorge Leitao

1
@JC sorunu açıklayabilir misiniz? Bu sadece bir alışkanlık meselesi mi yoksa with ... asifade bir şey getiriyor mu?
Titou

4
@ Sorun şu ki open.read () dosyayı kapatmıyor, bu yüzden ya with ... asda str.close()Pedro'nun cevabında gösterildiği gibi ihtiyacımız var. Daha kapanış dosyalarının önemine burada
JBallin

@JBallin. Bu deyim bir hata kaynağını açıkça kaldırır. Teşekkürler !
Titou

3
Bu aynı zamanda kötü çünkü sadece str()yerleşiklerden gölgeledin
Chris_Rands


45

Python 3.5 veya sonraki sürümlerde, pathlib kullanarak metin dosyası içeriğini bir değişkene kopyalayabilir ve dosyayı bir satırda kapatabilirsiniz :

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

ve sonra yeni satırları kaldırmak için str.replace komutunu kullanabilirsiniz :

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

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

join (), bir dize listesine katılacak ve hiçbir argüman içermeyen rstrip (), satır sonlarının son satırları dahil boşlukları kırpacaktır.


12

Bu, read () yöntemi kullanılarak yapılabilir:

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

Veya varsayılan modun kendisi 'r' (okuma) olduğundan,

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

9

Bir süre bu çevrede fiddled ve kullanım kullanımı tercih var readbirlikte rstrip. Olmadan rstrip("\n"), Python dizenin sonuna bir satırsonu ekler, bu çoğu durumda çok yararlı değildir.

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

6

Tam olarak neyin peşinde olduğunu söylemek zor, ama böyle bir şey başlasın:

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

reduce (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") çok daha serin: D
sleeplessnerd

3
@Duncan ne önerirsiniz?
Chris Eberle

data = ' '.join(line.replace('\n', '') for line in myfile)veya MagerValp'ın sürümü.
Duncan

6

splitlines()Henüz kimsenin bahsetmediğine şaşırdım .

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

Değişken dataartık yazdırıldığında aşağıdaki gibi görünen bir listedir:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Yeni satır olmadığını unutmayın ( \n).

Bu noktada, bir for döngüsü ile elde edebileceğiniz çizgileri konsola yazdırmak istediğiniz gibi geliyor:

for line in data:
    print line

4

Ayrıca her satırı kesebilir ve son bir dizeye birleştirebilirsiniz.

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

Bu da işe yarayacaktır.


Teşekkürler Pedro. Anlamak için ekledim.
Sai Kiriti Badam

3

Bunu iki kod satırına sıkıştırabilirsiniz !!!

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

Dosyanız şöyle ise:

hello how are you?
who are you?
blank blank

python çıkışı

hello how are you? who are you? blank blank

3

Bu, dosya nesnesini de kapatan tek satırlık, kopyalanabilir bir çözümdür:

_ = 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
A olan döngülerden string += linekaçınılmalıdır. Python'un bazı sürümleri burada O (n ^ 2) davranışından kaçınmayı başarabilir, ancak verilen diğer cevaplar bundan daha iyidir. Ayrıca, istenen yeni satırları kaldırmadınız, bu nedenle kodunuz çok yavaş bir şekilde yapılıyorstring = f.read()
Duncan

Beni düzelttiğiniz için teşekkürler. Ancak küçük bir şey, yeni satırı kaldırmamam gerekti, çünkü test ettiğimde '\ n' çıktısı almadı. Duncan
hungneox

2

python3: Köşeli ayraç sözdizimi sizin için yeniyse Google "liste uyumu".

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


1

Kimsenin sorunuzun [] kısmına hitap ettiğini düşünmüyorum. Her satırı değişkeninize okuduğunuzda, \ n yerine '' ifadesini değiştirmeden önce birden fazla satır olduğundan bir liste oluşturdunuz. X değişkeniniz varsa ve yalnızca

x

veya yazdır (x)

veya str (x)

Tüm listeyi parantez içinde göreceksiniz. (Sıralama dizisi) öğesinin her öğesini çağırırsanız

x [0] sonra parantezleri atlar. Str () işlevini kullanırsanız, yalnızca verileri görürsünüz. str (x [0])


1

Belki bunu deneyebilirsin? Bunu programlarımda kullanıyorum.

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

1

Normal ifade de işe yarar:

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

print (l)

['Ben', 'hisset', 'boş', 've', 'ölü', 'içeride']


1

Python kullanarak satır sonlarını kaldırmak için kullanabilirsiniz replace bir dizenin işlevini .

Bu örnek, 3 satır aralığının tümünü kaldırır:

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

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

Örnek dosya:

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

Bu yeniden oynatma senaryosunu kullanarak deneyebilirsiniz:

https://repl.it/repls/AnnualJointHardware

resim açıklamasını buraya girin


0

Bu çalışır: Dosyanızı şu şekilde değiştirin:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Sonra:

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

Bu, wordseşit olan bir liste oluşturur :

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

"\ N" den kurtuldu. Köşeli parantezlerin yolunuza çıkmasıyla ilgili kısmı cevaplamak için şunu yapın:

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

Veya:

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

Bu döndürür:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

1
Dosyayı değiştirmek bir kerelik bir durumda işe yarayabilir, ancak yüzlerce dosyanız varsa bu sadece uygulanabilir bir çözüm değildir.
Craicerjack

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

Bu kod, ilk satırı okumanıza yardımcı olur ve daha sonra list ve split seçeneğini kullanarak, bir listede depolanacak boşlukla ayrılmış ilk satır sözcüğünü dönüştürebilirsiniz.

Daha sonra herhangi bir kelimeye kolayca erişebilir veya hatta bir dizede saklayabilirsiniz.

Aynı şeyi for döngüsü kullanarak da yapabilirsiniz.


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

Takip etmeyi dene:

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

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

Dikkat: Bu kaldırmaz \n. Sadece metni sanki hiç yokmuş gibi görüntülemek içindir.\n

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.