Hướng dẫn python jump to line in file - python nhảy đến dòng trong tệp
Có bất kỳ lựa chọn thay thế nào cho mã dưới đây không: Show
Nếu tôi đang xử lý một tệp văn bản khổng lồ 5 với các dòng không xác định nhưng độ dài khác nhau và cần phải nhảy đến một dòng cụ thể nào tôi biết trước? Tôi cảm thấy tồi tệ bằng cách xử lý từng cái một khi tôi biết tôi có thể bỏ qua ít nhất là nửa đầu của tập tin. Tìm kiếm giải pháp thanh lịch hơn nếu có.
Đã hỏi ngày 6 tháng 3 năm 2009 lúc 20:49Mar 6, 2009 at 20:49
2 Bạn không thể nhảy về phía trước mà không đọc trong tệp ít nhất một lần, vì bạn không biết đường bị vỡ ở đâu. Bạn có thể làm một cái gì đó như:
Đã trả lời ngày 6 tháng 3 năm 2009 lúc 21:28Mar 6, 2009 at 21:28
Adam Rosenfieldadam RosenfieldAdam Rosenfield 380K96 Huy hiệu vàng508 Huy hiệu bạc584 Huy hiệu Đồng96 gold badges508 silver badges584 bronze badges 8 linecache:
Gnat 6.179104 Huy hiệu vàng53 Huy hiệu bạc72 Huy hiệu đồng104 gold badges53 silver badges72 bronze badges Đã trả lời ngày 6 tháng 3 năm 2009 lúc 20:58Mar 6, 2009 at 20:58
John Ellinwoodjohn EllinwoodJohn Ellinwood 14.1K7 Huy hiệu vàng37 Huy hiệu bạc48 Huy hiệu đồng7 gold badges37 silver badges48 bronze badges 4 Bạn thực sự không có nhiều tùy chọn đó nếu các dòng có độ dài khác nhau ... bạn thật đáng buồn cần xử lý các ký tự kết thúc dòng để biết khi nào bạn đã tiến tới dòng tiếp theo. Tuy nhiên, bạn có thể tăng tốc đáng kể điều này và giảm việc sử dụng bộ nhớ bằng cách thay đổi tham số cuối cùng thành "mở" thành một cái gì đó không phải 0. 0 có nghĩa là hoạt động đọc tệp không bị ảnh hưởng, rất chậm và tốn kém. 1 có nghĩa là tệp được đệm dòng, đó sẽ là một cải tiến. Bất cứ điều gì trên 1 (giả sử 8 kb, tức là 8192 hoặc cao hơn) đọc các đoạn của tệp vào bộ nhớ. Bạn vẫn truy cập nó thông qua 8, nhưng Python chỉ đi một chút một lần, loại bỏ từng khối được đệm sau khi được xử lý.
Wovano 3.3075 huy hiệu vàng20 Huy hiệu bạc43 Huy hiệu đồng5 gold badges20 silver badges43 bronze badges Đã trả lời ngày 6 tháng 3 năm 2009 lúc 21:28Mar 6, 2009 at 21:28
Adam Rosenfieldadam RosenfieldJarret Hardie 380K96 Huy hiệu vàng508 Huy hiệu bạc584 Huy hiệu Đồng10 gold badges130 silver badges125 bronze badges 1 Mô -đun 6 cho phép người ta lấy bất kỳ dòng nào từ tệp nguồn Python, trong khi cố gắng tối ưu hóa nội bộ, sử dụng bộ đệm, trường hợp phổ biến trong đó nhiều dòng được đọc từ một tệp. Điều này được sử dụng bởi mô -đun 7 để truy xuất các dòng nguồn để đưa vào dấu vết được định dạng ...
Wovano 3.3075 huy hiệu vàng20 Huy hiệu bạc43 Huy hiệu đồng5 gold badges20 silver badges43 bronze badges Jarret Hardiejarret HardieMar 6, 2009 at 21:25
91.9k10 Huy hiệu vàng130 Huy hiệu bạc125 Huy hiệu ĐồngSilentGhost Tôi có lẽ bị hư hỏng bởi Ram dồi dào, nhưng 15 m không lớn. Đọc vào bộ nhớ với 6 Đã trả lời ngày 6 tháng 3 năm 2009 lúc 21:25
Silentghostsilentghost
294K64 Huy hiệu vàng301 Huy hiệu bạc291 Huy hiệu Đồng
Tôi không có ai được đề cập đến IsliceApr 26, 2016 at 2:36
Hoặc nếu bạn muốn toàn bộ phần còn lại của tệpJoran Beasley Hoặc nếu bạn muốn mọi dòng khác từ tệp12 gold badges148 silver badges174 bronze badges Đã trả lời ngày 26 tháng 4 năm 2016 lúc 2:36
Joran Beasleyjoran Beasley 106K12 Huy hiệu vàng148 Huy hiệu bạc174 Huy hiệu đồngMar 6, 2009 at 21:33 Vì không có cách nào để xác định độ dài của tất cả các dòng mà không đọc chúng, bạn không có lựa chọn nào khác ngoài việc lặp lại tất cả các dòng trước dòng xuất phát của bạn. Tất cả những gì bạn có thể làm là làm cho nó trông đẹp. Nếu tệp thực sự rất lớn thì bạn có thể muốn sử dụng cách tiếp cận dựa trên trình tạo: Lưu ý: Chỉ mục bằng không dựa trên phương pháp này. Đã trả lời ngày 6 tháng 3 năm 2009 lúc 21:33 Nếu bạn không muốn đọc toàn bộ tệp trong bộ nhớ .. bạn có thể cần phải đưa ra một số định dạng khác ngoài văn bản thuần túy.Mar 6, 2009 at 21:31
Tất nhiên tất cả phụ thuộc vào những gì bạn đang cố gắng làm và tần suất bạn sẽ nhảy qua tệp.hasen Chẳng hạn, nếu bạn sẽ nhảy vào các dòng nhiều lần trong cùng một tệp và bạn biết rằng tệp không thay đổi trong khi làm việc với nó, bạn có thể làm điều này: trước tiên, đi qua toàn bộ tệp và ghi lại " tìm kiếm vị trí "của một số người đánh số chính (chẳng hạn như, bao giờ 1000 dòng), sau đó nếu bạn muốn dòng 12005, hãy nhảy đến vị trí 12000 (mà bạn đã ghi) sau đó đọc 5 dòng và bạn sẽ biết bạn 'Re trong dòng 12005 và cứ thế64 gold badges188 silver badges228 bronze badges Đã trả lời ngày 6 tháng 3 năm 2009 lúc 21:31 example:
Hasenhasen 157K64 Huy hiệu vàng188 Huy hiệu bạc228 Huy hiệu đồngAug 7, 2015 at 18:15
Bạn có thể sử dụng MMAP để tìm phần bù của các dòng. MMAP dường như là cách nhanh nhất để xử lý một tệpgeorge Sau đó sử dụng F.Seek (Offsets) để chuyển sang dòng bạn cần15 silver badges16 bronze badges 1 Đã trả lời ngày 7 tháng 8 năm 2015 lúc 18:15
GeorgeGeorge
1.60015 huy hiệu bạc16 Huy hiệu đồng Không có câu trả lời nào đặc biệt thỏa đáng, vì vậy đây là một đoạn trích nhỏ để giúp đỡ. Ví dụ sử dụng:Dec 4, 2019 at 23:11
1 Điều này liên quan đến việc thực hiện nhiều tìm kiếm tệp, nhưng rất hữu ích cho các trường hợp bạn không thể lắp toàn bộ tệp trong bộ nhớ. Nó có một lần đọc ban đầu để có được các vị trí dòng (vì vậy nó không đọc toàn bộ tệp, nhưng không giữ tất cả trong bộ nhớ), và sau đó mỗi truy cập thực hiện một tệp tìm kiếm sau thực tế. Chỉnh sửa: Bạn có thể sử dụng hàm linecache.getline (tên tệp, lineno), sẽ trả về nội dung của dòng chữ Lineno, nhưng chỉ sau khi đọc toàn bộ tệp vào bộ nhớ. Tốt nếu bạn truy cập ngẫu nhiên các dòng từ bên trong tệp (vì bản thân Python có thể muốn làm để in một dấu vết) nhưng không tốt cho tệp 15MB.: you can use the linecache.getline(filename, lineno) function, which will return the contents of the line lineno, but only after reading the entire file into memory. Good if you're randomly accessing lines from within the file (as python itself might want to do to print a traceback) but not good for a 15MB file. Đã trả lời ngày 6 tháng 3 năm 2009 lúc 21:06Mar 6, 2009 at 21:06
NoahnoahNoah 20.2k8 Huy hiệu vàng62 Huy hiệu bạc71 Huy hiệu đồng8 gold badges62 silver badges71 bronze badges 2 Điều gì tạo ra tệp bạn muốn xử lý? Nếu đó là một cái gì đó dưới sự kiểm soát của bạn, bạn có thể tạo một chỉ mục (dòng nào ở vị trí nào.) Tại thời điểm tệp được thêm vào. Tệp chỉ mục có thể có kích thước dòng cố định (số đệm hoặc 0 số đệm) và chắc chắn sẽ nhỏ hơn. Và do đó có thể được đọc và xử lý qucikly.
Đã trả lời ngày 28 tháng 4 năm 2010 lúc 7:39Apr 28, 2010 at 7:39
Kamathlnkamathlnkamathln Huy hiệu Silver 911 Huy hiệu Đồng1 silver badge7 bronze badges Tôi đã có cùng một vấn đề (cần phải lấy từ dòng cụ thể tệp khổng lồ). Chắc chắn, mỗi lần tôi có thể chạy qua tất cả các bản ghi trong hồ sơ và dừng nó khi bộ đếm sẽ bằng với dòng đích, nhưng nó không hoạt động hiệu quả trong trường hợp khi bạn muốn có được số lượng lớn các hàng cụ thể. Điều đó khiến vấn đề chính được giải quyết - cách xử lý trực tiếp đến nơi cần thiết của tệp. Tôi đã phát hiện ra quyết định tiếp theo: Đầu tiên tôi đã hoàn thành từ điển với vị trí bắt đầu của mỗi dòng (khóa là số dòng và giá trị - chiều dài được tích lũy của các dòng trước đó).
Cuối cùng, chức năng AIM: 0T.Seek (line_number) - lệnh thực hiện việc cắt tỉa tệp lên để khởi động. Vì vậy, nếu bạn tiếp theo cam kết Readline - bạn có được dòng mục tiêu của bạn. Sử dụng cách tiếp cận như vậy tôi đã lưu một phần đáng kể thời gian. Đã trả lời ngày 6 tháng 7 năm 2014 lúc 18:03Jul 6, 2014 at 18:03
Các dòng có chứa bất kỳ thông tin chỉ số nào không? Nếu nội dung của mỗi dòng giống như " 0", thì phương pháp 1 có thể được sử dụng để thực hiện tìm kiếm nhị phân thông qua tệp, ngay cả khi số lượng 2 là thay đổi. Bạn sẽ tìm đến điểm giữa của tệp, đọc một dòng, kiểm tra xem chỉ mục của nó cao hơn hay thấp hơn so với mục bạn muốn, v.v.Nếu không, điều tốt nhất bạn có thể làm chỉ là 9. Nếu bạn không muốn đọc tất cả 15MB, bạn có thể sử dụng đối số 4 để ít nhất thay thế rất nhiều 5 với số lượng cuộc gọi nhỏ hơn đến 9.Đã trả lời ngày 6 tháng 3 năm 2009 lúc 22:33Mar 6, 2009 at 22:33
DNSDNSDNS 36.3K18 Huy hiệu vàng90 Huy hiệu bạc127 Huy hiệu đồng18 gold badges90 silver badges127 bronze badges Nếu bạn đang xử lý một tệp văn bản và dựa trên hệ thống Linux, bạn có thể sử dụng các lệnh Linux. Đối với tôi, điều này hoạt động tốt! 1Đã trả lời ngày 23 tháng 3 năm 2016 lúc 9:47Mar 23, 2016 at 9:47
Hongkun Yoohongkun YooHongKun Yoo 3832 Huy hiệu vàng4 Huy hiệu bạc8 Huy hiệu đồng2 gold badges4 silver badges8 bronze badges 3 Dưới đây là một ví dụ sử dụng 7 để đọc một đoạn dòng tại một thời điểm. DNS chỉ ra giải pháp đó. Tôi đã viết ví dụ này bởi vì các ví dụ khác ở đây là định hướng một dòng. 2
Wovano 3.3075 huy hiệu vàng20 Huy hiệu bạc43 Huy hiệu đồng5 gold badges20 silver badges43 bronze badges Đã trả lời ngày 7 tháng 3 năm 2009 lúc 4:24Mar 7, 2009 at 4:24
Andrew Dalkandrew DalkeAndrew Dalke Phù vàng 14,5K3 Huy hiệu vàng38 Huy hiệu bạc53 Hàng đồng3 gold badges38 silver badges53 bronze badges @George đã đề xuất một cách xuất sắc MMAP, có lẽ sử dụng MMAP Syscall. Đây là một bản tái hiện khác. 3Đã trả lời ngày 25 tháng 11 năm 2021 lúc 9:17Nov 25, 2021 at 9:17
Có thể sử dụng chức năng này để trả về dòng N: 4Đã trả lời ngày 19 tháng 9 năm 2015 lúc 22:05Sep 19, 2015 at 22:05
KSEDKSEDksed 3361 Huy hiệu vàng4 Huy hiệu bạc13 Huy hiệu đồng1 gold badge4 silver badges13 bronze badges 2 Làm thế nào để bạn đi đến một dòng cụ thể trong một tệp python?Sử dụng readlines () để đọc phạm vi dòng từ tệp, phương thức readlines () đọc tất cả các dòng từ một tệp và lưu trữ nó trong danh sách.Bạn có thể sử dụng một số chỉ mục làm số dòng để trích xuất một tập hợp các dòng từ nó.Đây là cách đơn giản nhất để đọc một dòng cụ thể từ một tệp trong Python.
The readlines() method reads all lines from a file and stores it in a list. You can use an index number as a line number to extract a set of lines from it. This is the most straightforward way to read a specific line from a file in Python.
Làm thế nào để bạn bỏ qua một dòng trong một tệp văn bản trong Python?Có nhiều cách mà bạn có thể bỏ qua một dòng trong Python.Một số phương pháp là: nếu, tiếp tục, phá vỡ, vượt qua, đọc () và cắt lát.if, continue, break, pass, readlines(), and slicing.
Làm thế nào để bạn bỏ qua dòng đầu tiên của một tệp văn bản trong Python?Sử dụng Next () để đọc một tệp bắt đầu với dòng thứ hai Sử dụng Mở (tệp) để mở tệp.Gọi tiếp theo (Tệp) để bỏ qua dòng đầu tiên của tệp.Call next(file) to skip the first line of the file. |