Làm thế nào để đọc một tệp văn bản thành một biến chuỗi và tước dòng mới?


964

Tôi sử dụng đoạn mã sau để đọc một tệp trong python:

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

Tệp đầu vào là:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN
GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

và khi tôi in dữ liệu tôi nhận được

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN\n', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Như tôi thấy dữ liệu ở listdạng. Làm thế nào để tôi làm cho nó chuỗi? Và cũng có thể làm thế nào để loại bỏ các "\n", "[""]"các nhân vật từ nó?



7
Tiêu đề và câu hỏi không nhất quán. Bạn có thực sự muốn thoát khỏi \ n không?
Julian

2
Bạn có thực sự muốn xóa các dòng mới khỏi nội dung tệp / chuỗi hay bạn chỉ bối rối về nhiều ký tự meta trong đầu ra in của mình và thực sự muốn giữ các dòng mới, nhưng không hiển thị chúng dưới dạng "\ n"?
mnagel

11
Đối với những người đến đây từ một công cụ tìm kiếm, có lẽ bạn đang tìm kiếm câu trả lời của @ xiaoyu
Jonathan Sudiaman

Câu trả lời:


1321

Bạn đã có thể sử dụng:

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

66
Có một nhược điểm trong chỉ viết open("data.txt").read().replace('\n','')thay thế?
tuomassalo

262
Có, phiên bản của bạn không đóng tệp một cách rõ ràng, sau đó sẽ bị trì hoãn cho đến khi trình thu gom rác chạy hoặc chương trình kết thúc. Câu lệnh 'với' thường gói gọn một số hành động thiết lập / đóng mở.
mất ngủ

12
Cảm ơn bạn đã làm rõ. Vì vậy, có vẻ như phiên bản của tôi có thể ổn đối với các tập lệnh nhỏ - nhưng tốt nhất nên tránh hoàn toàn OTOH để không biến nó thành thói quen.
tuomassalo

10
@tuomassalo, đây là một PITA rất lớn trong quá trình kiểm tra / gỡ lỗi, vì nó sẽ không dọn sạch các thẻ xử lý mở nếu bạn phải chấm dứt sớm hoặc nó gặp phải một ngoại lệ.
Đi vào

13
Không, rstrip('\n')sẽ chỉ xóa dòng mới từ dòng cuối cùng, replace('\n','')xóa nó ở mọi nơi (về cơ bản làm cho toàn bộ tập tin thành một dòng)
mất ngủ

632

Sử dụng read(), không readline():

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

6
Có lẽ, nhưng nó không loại bỏ các dòng mới như OP muốn. Tôi vẫn thích nó mặc dù.
Randall Cook

60
Nếu bạn đang trả về một chuỗi đơn, tước dòng mới sẽ không có ý nghĩa gì - OP nên chọn một chuỗi hoặc tước \ n khỏi chuỗi trong danh sách.
Alex Dupuy

Hoạt động nhưng không phải tệp Unicode. Để hỗ trợ utf8 trên python3, hãy sử dụng một đối số phụencoding="utf-8"
FindOutIslamNow

2
Tôi không hiểu tại sao giải pháp này đã được đăng và nó cũng nhận được rất nhiều sự ủng hộ. Về cơ bản, nó giống như cái được chấp nhận hơn một năm trước và thậm chí nó còn thiếu phần tước dây mới, khiến điều này thậm chí còn ít hữu ích hơn ..
nnsense

65

Bạn có thể đọc từ một tệp trong một dòng:

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

Xin lưu ý rằng điều này không đóng tệp rõ ràng.

CPython sẽ đóng tệp khi nó thoát như một phần của bộ sưu tập rác.

Nhưng việc thực hiện trăn khác sẽ không. Để viết mã di động, tốt hơn là sử dụng withhoặc đóng tệp một cách rõ ràng. Ngắn không phải lúc nào cũng tốt hơn. Xem https://stackoverflow.com/a/7396043/362951


32
Điều này là chống thành ngữ và không được khuyến khích. opennên được sử dụng trong một with ... astuyên bố.
Jorge Leitao

1
@JC bạn có thể giải thích vấn đề? Đây chỉ là một câu hỏi của tùy chỉnh hoặc with ... astuyên bố mang lại một cái gì đó?
Titou

4
@Titou vấn đề là open.read () không đóng tệp nên chúng ta cần with ... ashoặc str.close()như thể hiện trong câu trả lời của Pedro. Tìm hiểu thêm về tầm quan trọng của việc đóng tệp tại đây
JBallin

@Jallin. Thành ngữ này rõ ràng loại bỏ một nguồn lỗi. Cảm ơn !
Titou

3
Điều này cũng tệ vì bạn vừa bị che khuất str()khỏi các nội trang
Chris_Rands

50

Để nối tất cả các dòng thành một chuỗi và loại bỏ các dòng mới tôi thường sử dụng:

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

Nó đang cung cấp UnicodeDecodeError trong mã của tôi Xem stackoverflow.com/q/18649512/9339242
Arayan Singh

bạn có thể cần chỉ định mã hóa ký tự.
CONvid19

45

Trong Python 3.5 trở lên, sử dụng pathlib, bạn có thể sao chép nội dung tệp văn bản vào một biến và đóng tệp trong một dòng:

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

và sau đó bạn có thể sử dụng str.replace để xóa các dòng mới:

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

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

tham gia () sẽ tham gia một danh sách các chuỗi và rstrip () không có đối số sẽ cắt bớt khoảng trắng, bao gồm cả các dòng mới, từ cuối chuỗi.


12

Điều này có thể được thực hiện bằng phương thức read ():

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

Hoặc như chế độ mặc định là 'r' (đọc) nên chỉ cần sử dụng,

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

9

Tôi đã loay hoay với điều này trong một thời gian và thích sử dụng readkết hợp với rstrip. Không có rstrip("\n"), Python thêm một dòng mới vào cuối chuỗi, trong hầu hết các trường hợp không hữu ích lắm.

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

6

Thật khó để nói chính xác những gì bạn đang theo đuổi, nhưng một cái gì đó như thế này sẽ giúp bạn bắt đầu:

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

giảm (lambda x, y: x + y.rstrip ('\ n'), ['a \ n', "b \ n", 'c'], "") mát hơn rất nhiều: D
mất ngủ

3
@Duncan bạn muốn đề nghị gì?
Chris Eberle

data = ' '.join(line.replace('\n', '') for line in myfile)hoặc phiên bản của MagerValp.
Duncan

6

Tôi ngạc nhiên không ai đề cập đến splitlines().

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

Biến databây giờ là một danh sách trông như thế này khi được in:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Lưu ý không có dòng mới ( \n).

Tại thời điểm đó, có vẻ như bạn muốn in lại các dòng vào bảng điều khiển, điều mà bạn có thể đạt được với một vòng lặp for:

for line in data:
    print line

4

Bạn cũng có thể tách từng dòng và nối thành một chuỗi cuối cùng.

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

Điều này cũng sẽ làm việc tốt.


Cảm ơn Pedro. Tôi chỉ thêm nó cho mục đích hiểu.
Sai Kiriti Badam

3

bạn có thể nén nó thành một thành hai dòng mã !!!

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

nếu tập tin của bạn đọc:

hello how are you?
who are you?
blank blank

sản lượng trăn

hello how are you? who are you? blank blank

3

Đây là một giải pháp có thể sao chép một dòng, cũng có thể đóng đối tượng tệp:

_ = 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
Vòng lặp có một string += linenên tránh. Một số phiên bản của Python có thể quản lý để tránh hành vi O (n ^ 2) ở đây nhưng bất kỳ câu trả lời nào khác đã được đưa ra đều tốt hơn thế này. Ngoài ra, bạn đã không xóa các dòng mới được yêu cầu để mã của bạn chỉ là một cách làm rất chậmstring = f.read()
Duncan

Cảm ơn đã sửa lỗi cho tôi. Nhưng một điều nhỏ là tôi không phải xóa dòng mới, vì khi tôi thử nghiệm, nó không in ra '\ n'. @Duncan
hungneox

2

python3: Google "liệt kê danh sách" nếu cú ​​pháp dấu ngoặc vuông là mới đối với bạn.

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


1

Tôi không cảm thấy rằng bất cứ ai đã giải quyết phần [] của câu hỏi của bạn. Khi bạn đọc từng dòng vào biến của mình, vì có nhiều dòng trước khi bạn thay thế \ n bằng '' bạn đã kết thúc việc tạo một danh sách. Nếu bạn có một biến là x và in nó ra chỉ bằng

x

hoặc in (x)

hoặc str (x)

Bạn sẽ thấy toàn bộ danh sách với dấu ngoặc. Nếu bạn gọi từng phần tử của (mảng sắp xếp)

x [0] sau đó nó bỏ qua dấu ngoặc. Nếu bạn sử dụng hàm str (), bạn sẽ chỉ thấy dữ liệu chứ không phải ''. str (x [0])


1

Có lẽ bạn có thể thử điều này? Tôi sử dụng điều này trong các chương trình của tôi.

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

1

Biểu thức chính quy cũng hoạt động:

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

print (l)

['Tôi', 'cảm thấy', 'trống rỗng', 'và', 'chết', 'bên trong']


1

Để loại bỏ ngắt dòng bằng Python, bạn có thể sử dụng replacechức năng của một chuỗi.

Ví dụ này loại bỏ cả 3 loại ngắt dòng:

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

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

Tệp ví dụ là:

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

Bạn có thể thử nó bằng kịch bản phát lại này:

https://repl.it/repls/AnnualJointHardware

nhập mô tả hình ảnh ở đây


0

Điều này hoạt động: Thay đổi tập tin của bạn thành:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

Sau đó:

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

Điều này tạo ra một danh sách có tên wordsbằng:

['LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN', 'GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE']

Điều đó đã thoát khỏi "\ n". Để trả lời phần về dấu ngoặc theo cách của bạn, chỉ cần làm điều này:

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

Hoặc là:

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

Điều này trả về:

LLKKKKKKKKMMMMMMMMNNNNNNNNNNNNN, GGGGGGGGGHHHHHHHHHHHHHHHHHHHHEEEEEEEE

1
Thay đổi tệp có thể hoạt động trong một tình huống tắt nhưng nếu bạn có hàng trăm tệp thì đây không phải là giải pháp khả thi.
Craicerjack ngày

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

Mã này sẽ giúp bạn đọc dòng đầu tiên và sau đó sử dụng tùy chọn danh sách và phân tách, bạn có thể chuyển đổi từ dòng đầu tiên được phân tách bằng dấu cách để được lưu trữ trong danh sách.

Hơn bạn có thể dễ dàng truy cập bất kỳ từ nào, hoặc thậm chí lưu trữ nó trong một chuỗi.

Bạn cũng có thể làm điều tương tự với việc sử dụng vòng lặp 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

Hãy thử như sau:

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

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

Chú ý: Nó không loại bỏ \n. Nó chỉ để xem văn bản như thể không có\n

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.