2010-10-18 34 views
32

Tôi cần lấy số dòng của một cụm từ trong một tệp văn bản. Cụm từ có thể là:Lấy Dòng Số cụm từ nhất định trong tệp Python

the dog barked 

Tôi cần mở tệp, tìm kiếm cụm từ đó và nhập số dòng.

Tôi đang sử dụng Python 2.6 trên Windows XP


này là gì I Have:

o = open("C:/file.txt") 
j = o.read() 
if "the dog barked" in j: 
    print "Found It" 
else: 
    print "Couldn't Find It" 

Đây không phải là bài tập về nhà, nó là một phần của một dự án tôi đang làm việc trên . Tôi thậm chí không có một đầu mối làm thế nào để có được số dòng.

+3

là bài tập về nhà này? –

+0

bạn có gì cho đến nay? Ý tôi là, chúng tôi biết bạn biết cách mở một tệp. Bạn đang tìm kiếm cụm từ như thế nào? – SilentGhost

+1

@SilentGhost, tôi là một lập trình viên Python rất mạnh. Chỉ cần không bao giờ phải làm điều này trước đây. Tôi đã viết một số ứng dụng, cụ thể là ứng dụng kiểm soát của phụ huynh trên web mà công ty sẽ phát hành trong vòng vài tháng tới. Chỉ cần nhấn một "tế bào não chết", đó là tất cả. –

Trả lời

60
lookup = 'the dog barked' 

with open(filename) as myFile: 
    for num, line in enumerate(myFile, 1): 
     if lookup in line: 
      print 'found at line:', num 
+3

Cảm ơn bạn đã đăng * đúng cách (tm) * để làm điều đó (tốt, ngoại trừ việc đếm dòng bắt đầu từ 0 - ok đối với người lập trình nhưng không được cho người không phải là người dùng công nghệ). +1 – delnan

+0

Đây là những gì đã hiệu quả. Bây giờ, chỉ là một câu hỏi ... bạn có biết cách đọc một số dòng cụ thể trong một tệp văn bản không? –

+2

Trong python 2.6 và sau đó, tôi nghĩ, 'enumerate()' lấy một đối số của số để bắt đầu đếm tại, ví dụ: 'liệt kê (myFile, 1)'. – hughdbrown

1

Mở tập tin của bạn, và sau đó làm một cái gì đó giống như ...

for line in f: 
    nlines += 1 
    if (line.find(phrase) >= 0): 
     print "Its here.", nlines 

Có rất nhiều cách đọc dòng từ tập tin trong Python, nhưng kỹ thuật for line in f là hiệu quả hơn so với hầu hết.

+1

Sai? Ở đâu? ...? Nếu đó là> thay vì> =, tôi chỉ sửa nó, bạn nói đúng, và ... bạn có thể chỉ ra rằng thay vì nói câu trả lời là sai và nói xấu. – slezica

+0

@santi: bối rối là viết mã c trong python. Xem câu trả lời của Sacha – SilentGhost

+0

Vâng, tôi không thể làm cho nó hoạt động. Cảm ơn bạn đã đăng bài. –

5
f = open('some_file.txt','r') 
line_num = 0 
search_phrase = "the dog barked" 
for line in f.readlines(): 
    line_num += 1 
    if line.find(search_phrase) >= 0: 
     print line_num 

CHỈNH SỬA 1.5 năm sau (sau khi thấy nó nhận được một ưu tiên khác): Tôi để nguyên trạng thái này; nhưng nếu tôi đang viết hiện nay sẽ viết một cái gì đó gần gũi hơn với giải pháp Ash/suzanshakya của:

def line_num_for_phrase_in_file(phrase='the dog barked', filename='file.txt') 
    with open(filename,'r') as f: 
     for (i, line) in enumerate(f): 
      if phrase in line: 
       return i 
    return -1 
  • Sử dụng with để mở file này là thành ngữ pythonic - nó đảm bảo các tập tin sẽ được đóng lại đúng cách khi khối bằng cách sử dụng tập tin kết thúc.
  • Lặp lại thông qua tệp bằng cách sử dụng for line in f tốt hơn nhiều so với for line in f.readlines(). Trước đây là pythonic (ví dụ, sẽ hoạt động nếu f là bất kỳ biến lặp chung nào; không nhất thiết phải là đối tượng tệp triển khai readlines) và hiệu quả hơn f.readlines() tạo danh sách với toàn bộ tệp trong bộ nhớ và sau đó lặp qua nó. * if search_phrase in line có nhiều pythonic hơn if line.find(search_phrase) >= 0, vì nó không yêu cầu line để thực hiện find, đọc dễ dàng hơn để xem những gì được dự định và không dễ dàng bị hỏng (ví dụ: if line.find(search_phrase)if line.find(search_phrase) > 0 cả hai sẽ không hoạt động đối với tất cả các trường hợp chỉ số của trận đấu đầu tiên hoặc -1).
  • Đơn giản/sạch hơn của nó để bọc một mục được lặp lại trong enumerate như for i, line in enumerate(f) hơn để khởi tạo line_num = 0 trước vòng lặp và sau đó tăng theo cách thủ công trong vòng lặp. (Mặc dù cho là, điều này khó đọc hơn đối với những người không quen thuộc với enumerate.)

Xem code like pythonista

+0

Điều này tương tự như giải pháp của Santiago; ngoại trừ nó phải là> = 0, như thể nó ở đầu dòng, tìm sẽ trả về 0 nếu cụm từ có mặt. (Nếu nó không có nó sẽ là -1). –

+0

-1 để đưa nó trở lại 0. Sử dụng readlines hiếm khi là một ý tưởng tốt, chỉ cần lặp lại các tập tin. – delnan

+0

Trong hàm line_num_for_phrase_in_file, có phải là NẾU PHRASE IN F, hoặc NẾU PHRASE IN LINE? –

4
def get_line_number(phrase, file_name): 
    with open(file_name) as f: 
     for i, line in enumerate(f, 1): 
      if phrase in line: 
       return i 
+1

Tôi sẽ sử dụng 'return None' thay vì' return 0' nhưng điều này là tốt. –

+0

Tôi đã sử dụng 'return 0' để tạo kiểu trả về của số nguyên' get_line_number'. Tại sao bạn nghĩ rằng 'return None' là tốt hơn? – suzanshakya

+1

'None' làm cho nó rõ ràng rằng cụm từ đã không được tìm thấy, trong khi' 0' chỉ là một quy ước. Ngoài ra nó đảm bảo rằng nếu kết quả không được kiểm tra bởi người gọi, chương trình sẽ có khả năng thất bại một cách ngoạn mục khi lỗi được vấp, làm cho gỡ lỗi dễ dàng hơn. –

0
for n,line in enumerate(open("file")): 
    if "pattern" in line: print n+1 
1
list = open("file_name","mode") 

if "search element" in list: 
    print list.index("search element") # This will gives you the line number 
+1

Điều này trả về số ký tự thay vì số dòng. – Lydia

0

Đây là những gì tôi đã tìm thấy để làm việc:

f_rd = open(path, 'r') 
file_lines = f_rd.readlines() 
f_rd.close() 

matches = [line for line in file_lines if "chars of Interest" in line] 
index = file_lines.index(matches[0]) 
0

suzanshakya, tôi thực sự thay đổi mã của bạn Tôi gầy k điều này sẽ đơn giản hóa mã, nhưng hãy chắc chắn trước khi chạy mã các tập tin phải được trong cùng một thư mục của giao diện điều khiển nếu không bạn sẽ nhận được lỗi.

lookup="The_String_You're_Searching" 
file_name = open("file.txt") 
for num, line in enumerate(file_name,1): 
     if lookup in line: 
      print(num) 
Các vấn đề liên quan