Chỉ đọc dòng đầu tiên của một tập tin?


208

Làm thế nào bạn chỉ nhận được dòng đầu tiên của tệp dưới dạng chuỗi với Python?


4
Nếu bạn đã đọc tệp ("Sau khi đọc trong tệp"), bạn đã đọc dòng đầu tiên! (Giả sử có ít nhất một dòng.)
William Pursell

3
Lưu ý rằng câu hỏi như bây giờ có nghĩa khác với câu hỏi ban đầu. Một số câu trả lời bây giờ trông thật ngớ ngẩn khi họ tính đến phần "sau khi đọc trong tệp" (đã bị xóa).
Peter Hansen

Câu trả lời:


353

Sử dụng .readline()phương thức ( tài liệu Python 2 , tài liệu Python 3 ):

with open('myfile.txt') as f:
    first_line = f.readline()

Một số lưu ý:

  1. Như đã lưu ý trong các tài liệu, trừ khi nó là dòng duy nhất trong tệp, chuỗi được trả về từ f.readline()sẽ chứa một dòng mới. Bạn có thể muốn sử dụng f.readline().strip()thay thế để loại bỏ dòng mới.
  2. Câu withlệnh sẽ tự động đóng tệp lại khi khối kết thúc.
  3. Câu withlệnh chỉ hoạt động trong Python 2.5 trở lên và trong Python 2.5 bạn cần sử dụngfrom __future__ import with_statement
  4. Trong Python 3, bạn nên chỉ định mã hóa tệp cho tệp bạn mở. Đọc thêm...

3
Trong Python 3 nếu tệp là ascii hoặc utf8, bạn không phải chỉ định mã hóa tệp. Và nếu không phải, bạn nên chỉ định mã hóa thành codec.open trong Python 2.
Evpok

2
@Evpok "Trong Python 3 nếu tệp là ascii hoặc utf8, bạn không phải chỉ định mã hóa tệp" - nếu điều đó hoàn toàn đúng! Thực tế thì hơi lộn xộn hơn; như đã lưu ý trong các tài liệu, mã hóa mặc định được sử dụng phụ thuộc vào nền tảng (và có thể khác nhau ngay cả trên cùng một máy tính tùy thuộc vào cách bạn khởi chạy Python - ví dụ, tôi đã thấy mã hoạt động ở trình bao bình thường của mình bằng cách giả sử UTF-8 phát nổ sau khi chạy qua Apache với mod_wsgi).
Đánh dấu Amery


20
fline=open("myfile").readline().rstrip()

Tôi đến đây để tìm kiếm điều này. Đặc biệt là kể từ khi rstrip()loại bỏ các ký tự dòng mới.
Sawash Shashank

5
-1; điều này không đóng tệp và trả về kết quả không chính xác nếu dòng đầu tiên chứa bất kỳ khoảng trắng theo sau bên cạnh ký tự dòng mới.
Đánh dấu Amery

@MarkAmery: Trên thực tế, vì xử lý tệp không được gán cho một biến, nó là rác được thu thập ngay lập tức, đóng tệp. (Mặc dù, tất nhiên, giải pháp được chấp nhận sử dụng trình quản lý bối cảnh vẫn tốt hơn nhiều.)
acdr

@acdr Những gì bạn nói là đúng với CPython nhưng không phải với các triển khai Python khác - xem ví dụ: các tài liệu thu gom rác PyPy có đề cập đến một điểm quan tâm cụ thể rằng "các tệp ... không được đóng ngay lập tức khi chúng ra khỏi phạm vi" . Vì lý do này, nó thường được lập luận (ví dụ tại stackoverflow.com/a/7396043/1709587 ) rằng việc dựa vào hành vi mà bạn mô tả là thực tiễn xấu.
Mark Amery

9

Điều này nên làm điều đó:

f = open('myfile.txt')
first = f.readline()

9

Để quay lại phần đầu của tệp đang mở và sau đó trả về dòng đầu tiên, hãy làm điều này:

my_file.seek(0)
first_line = my_file.readline()

1
Để hiểu rõ hơn, nó sẽ là "my_file.seek (0) line = my_file.readline ()"
Alberto Perez

7
first_line = next(open(filename))

1
Điều này có đóng tập tin là tốt?
abalter

Cuối cùng, khi Python rời khỏi khối.
vy32

6

Rất nhiều câu trả lời khác ở đây, nhưng để trả lời chính xác câu hỏi bạn đã hỏi (trước khi @MarkAmery đi và chỉnh sửa câu hỏi ban đầu và thay đổi ý nghĩa):

>>> f = open('myfile.txt')
>>> data = f.read()
>>> # I'm assuming you had the above before asking the question
>>> first_line = data.split('\n', 1)[0]

Nói cách khác, nếu bạn đã đọc trong tệp (như bạn đã nói) và có một khối dữ liệu lớn trong bộ nhớ, thì để có được dòng đầu tiên từ nó một cách hiệu quả, hãy thực hiện phân tách () trên ký tự dòng mới, một lần chỉ và lấy phần tử đầu tiên từ danh sách kết quả.

Lưu ý rằng điều này không bao gồm \nký tự ở cuối dòng, nhưng tôi cho rằng dù sao bạn cũng không muốn nó (và một tệp một dòng thậm chí có thể không có). Cũng lưu ý rằng mặc dù nó khá ngắn và nhanh, nhưng nó tạo ra một bản sao của dữ liệu, vì vậy đối với một bộ nhớ thực sự lớn, bạn có thể không coi đó là "hiệu quả". Như mọi khi, nó phụ thuộc ...


8
Nếu đây là một tệp lớn, f.read () sẽ cố tải toàn bộ tệp vào bộ nhớ, đây sẽ không phải là ý kiến ​​hay. Một cách khác là đọc một ký tự tại một thời điểm cho đến khi gặp dòng mới hoặc EOF
ngẫu nhiên. Suy nghĩ

Trên thực tế, tất cả các câu trả lời khác là lựa chọn thay thế tốt hơn thế. Thông thường đọc một tệp có readline () và bạn bè sẽ tải toàn bộ các khối tại một thời điểm, có thể 32K cho hoặc nhận và tìm kiếm thông qua đó để tìm dòng mới tiếp theo. Nhanh hơn nhiều và hiệu quả hơn. Câu trả lời của tôi sẽ chỉ hữu ích nếu anh ta đã tải toàn bộ, trong trường hợp đó chúng ta có thể cho rằng anh ta ổn với việc có tất cả trong bộ nhớ.
Peter Hansen

2
Tôi không tin rằng tôi đã thay đổi ý nghĩa. Thật vô nghĩa khi hỏi cách "đọc" dòng đầu tiên từ một tệp sau khi "đọc" toàn bộ tệp. Như vậy, điều khá rõ ràng đối với tôi là ý định của người hỏi không cho rằng .read()phải được gọi trước.
Đánh dấu Amery

@MarkAmery, câu hỏi được diễn đạt kém ("khá vô nghĩa") vì vậy bạn đã đoán được ý định ("rõ ràng với tôi") và điều chỉnh lại cho phù hợp. Giải thích của tôi khác nhau. Rõ ràng cho đến khi và trừ khi làm rõ harpalss, tất cả chúng ta phải là những từ ngữ ban đầu cộng với sự chấp nhận của ông về một câu trả lời (tức là "tìm kiếm (0)") mà với tôi rõ ràng cho thấy rằng ông đã đã đọc trong tập tin, ít nhất là qua dòng đầu tiên.
Peter Hansen

bạn nên loại bỏ câu trả lời này nó không phải là cách đúng đắn và có thể lừa mọi người
thang

-15
f1 = open("input1.txt", "r")
print(f1.readline())

19
Có nhiều câu trả lời trên năm tuổi có chứa chính xác phương pháp này . Bạn không làm gì ngoài việc tạo ra tiếng ồn bằng cách thêm một cái khác.
Đánh dấu Amery
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.