จะอ่านไฟล์ข้อความในตัวแปรสตริงและตัดบรรทัดใหม่ได้อย่างไร


963

ฉันใช้ส่วนรหัสต่อไปนี้เพื่ออ่านไฟล์ในไพ ธ อน:

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

ไฟล์อินพุตคือ:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

และเมื่อฉันพิมพ์ข้อมูลฉันจะได้รับ

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

ตามที่ฉันเห็นข้อมูลอยู่ในlistรูปแบบ ฉันจะทำให้มันสตริงได้อย่างไร และยังเป็นวิธีที่ฉันจะลบ"\n", "["และ"]"ตัวละครจากมันได้หรือไม่



7
ชื่อเรื่องและคำถามไม่สอดคล้องกัน คุณต้องการกำจัด \ n ด้วยหรือไม่
Julian

2
คุณต้องการลบบรรทัดใหม่ออกจากเนื้อหาของไฟล์ / สตริงหรือคุณแค่สับสนกับเมตาอักขระจำนวนมากในผลงานพิมพ์ของคุณและต้องการเก็บบรรทัดใหม่ แต่ไม่แสดงเป็น "\ n"
mnagel

11
สำหรับผู้ที่มาที่นี่จากเครื่องมือค้นหาคุณอาจมองหาคำตอบของ @ xiaoyu
Jonathan Sudiaman

คำตอบ:


1319

คุณสามารถใช้:

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

66
มีข้อเสียเพียงเขียนopen("data.txt").read().replace('\n','')แทน?
tuomassalo

262
ใช่รุ่นของคุณไม่ได้ปิดไฟล์อย่างชัดเจนซึ่งจะล่าช้าจนกว่าตัวรวบรวมขยะจะทำงานหรือโปรแกรมหยุดทำงาน คำสั่ง 'พร้อม' มักจะสรุปการตั้งค่า / การกระทำการเปิด / ปิดบางอย่าง
sleeplessnerd

12
ขอขอบคุณสำหรับการชี้แจง. ดังนั้นดูเหมือนว่ารุ่นของฉันอาจใช้ได้กับสคริปต์ขนาดเล็ก - แต่ OTOH ควรหลีกเลี่ยงโดยรวมเพื่อไม่ให้เป็นนิสัย
tuomassalo

10
@tuomassalo เป็น PITA ขนาดใหญ่ในกระบวนการทดสอบ / การดีบักเนื่องจากจะไม่ล้างหมายเลขอ้างอิงไฟล์ที่เปิดหากคุณต้องยกเลิกก่อนกำหนดหรือมีข้อยกเว้น
GoingTharn

13
ไม่rstrip('\n')จะลบบรรทัดใหม่ออกจากบรรทัดสุดท้ายเท่านั้นreplace('\n','')ลบออกทุกที่ (เป็นหลักทำให้ทั้งไฟล์หนึ่งบรรทัด)
sleeplessnerd

631

ใช้read()ไม่ใช่readline():

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

6
บางที แต่มันไม่ได้ตัดบรรทัดใหม่ตามที่ OP ต้องการ ฉันยังคงชอบมัน
Randall Cook

60
หากคุณส่งคืนสตริงเดียวการขึ้นบรรทัดใหม่จะไม่สมเหตุสมผล - OP ควรเลือกหนึ่งสตริงหรือดึง \ n จากสตริงในรายการ
Alex Dupuy

ใช้งานได้ แต่ไม่ใช่ไฟล์ Unicode เพื่อรองรับ utf8 บน python3 ใช้อาร์กิวเมนต์พิเศษencoding="utf-8"
FindOutIslamNow

2
ฉันไม่เข้าใจว่าทำไมโพสต์นี้ถึงได้แก้ปัญหาและยังได้รับอัปโหลดมากมาย โดยพื้นฐานแล้วเหมือนกับที่ได้รับการยอมรับเมื่อปีที่แล้วและมันก็ยังขาดส่วนของการลอกบรรทัดใหม่ทำให้มันมีประโยชน์น้อยลง ..
nnsense

65

คุณสามารถอ่านจากไฟล์ในหนึ่งบรรทัด:

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

โปรดทราบว่านี่จะไม่ปิดไฟล์อย่างชัดเจน

CPython จะปิดไฟล์เมื่อออกจากเป็นส่วนหนึ่งของการรวบรวมขยะ

แต่การใช้งานหลามอื่น ๆ จะไม่เกิดขึ้น ในการเขียนโค้ดพกพาควรใช้withหรือปิดไฟล์อย่างชัดเจน สั้นไม่ดีกว่าเสมอ ดูhttps://stackoverflow.com/a/7396043/362951


32
นี่คือการต่อต้านสำนวนและไม่แนะนำ openควรใช้ภายในwith ... asคำสั่ง
Jorge Leitao

1
@JC คุณสามารถอธิบายปัญหาได้หรือไม่ นี่เป็นเพียงคำถามของการกำหนดเองหรือwith ... asคำสั่งนำบางสิ่งบางอย่าง?
Titou

4
@Titou ปัญหาคือ open.read () ไม่ได้ปิดไฟล์ดังนั้นเราต้องการwith ... asหรือstr.close()แสดงในคำตอบของ Pedro ข้อมูลเพิ่มเติมเกี่ยวกับความสำคัญของการปิดไฟล์ที่นี่
JBallin

@JBallin สำนวนนี้ลบแหล่งที่มาของข้อผิดพลาดอย่างชัดเจน ขอบคุณมาก!
Titou

3
สิ่งนี้ก็ไม่ดีเช่นกันเพราะคุณเพิ่งสร้างเงาstr()จากภายใน
Chris_Rands

50

ในการเข้าร่วมทุกบรรทัดในสตริงและลบบรรทัดใหม่ที่ฉันใช้ตามปกติ:

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

มันให้ UnicodeDecodeError ในรหัสของฉันดูstackoverflow.com/q/18649512/9339242
Arayan Singh เมื่อ

คุณอาจต้องระบุการเข้ารหัสอักขระ
CONVID19 19

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)

เข้าร่วม () จะเข้าร่วมรายการของสตริงและ rstrip () โดยไม่มีข้อโต้แย้งจะตัดช่องว่างรวมถึงการขึ้นบรรทัดใหม่จากปลายสาย


12

สิ่งนี้สามารถทำได้โดยใช้วิธี read ():

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

หรือโหมดเริ่มต้นคือ 'r' (อ่าน) ดังนั้นใช้ง่าย

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

9

ฉันได้ fiddled รอบกับในขณะนี้และได้ชอบที่จะใช้การใช้งานร่วมกับ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
sleeplessnerd

3
@ ดันแคนคุณจะแนะนำอะไร
Chris Eberle

data = ' '.join(line.replace('\n', '') for line in myfile)หรือเวอร์ชันของ MagerValp
Duncan

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();

สิ่งนี้จะได้ผลดี


ขอบคุณเปโดร ฉันเพิ่งเพิ่มมันเพื่อความเข้าใจ
Sai Kiriti Badam

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()
ดันแคน

ขอบคุณสำหรับการแก้ไขฉัน แต่สิ่งหนึ่งที่เล็กคือฉันไม่ได้ลบบรรทัดใหม่เพราะเมื่อฉันทดสอบมันไม่ได้พิมพ์ '\ n' ออก @Duncan
hungneox

2

python3: Google "list comphrension" ถ้าไวยากรณ์ของวงเล็บเหลี่ยมเป็นของใหม่สำหรับคุณ

 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 และพิมพ์ออกมาโดย

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

รหัสนี้จะช่วยให้คุณอ่านบรรทัดแรกแล้วใช้รายการและตัวเลือกแยกคุณสามารถแปลงคำบรรทัดแรกคั่นด้วยช่องว่างเพื่อเก็บไว้ในรายการ

กว่าที่คุณจะสามารถเข้าถึงคำใด ๆ หรือแม้แต่เก็บไว้ในสตริง

คุณสามารถทำสิ่งเดียวกันโดยใช้การ for for loop


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.