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:

startFromLine = 141978 # or whatever line I need to jump to

urlsfile = open(filename, "rb", 0)

linesCounter = 1

for line in urlsfile:
    if linesCounter > startFromLine:
        DoSomethingWithThisLine(line)

    linesCounter += 1

Nếu tôi đang xử lý một tệp văn bản khổng lồ

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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ướng dẫn python jump to line in file - python nhảy đến dòng trong tệp

Đã 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ư:

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])

Đã 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:

Mô -đun

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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
# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
7 để truy xuất các dòng nguồn để đưa vào dấu vết được định dạng ...

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

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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
# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
9 là những gì tôi thường làm với các tệp có kích thước này. Truy cập một dòng sau đó là tầm thường.64 gold badges301 silver badges291 bronze badges

6

Đã trả lời ngày 6 tháng 3 năm 2009 lúc 21:25

line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line

Silentghostsilentghost

rest_of_file = itertools.islice(Fhandle,index_of_interest)
for line in rest_of_file:
    print line

294K64 Huy hiệu vàng301 Huy hiệu bạc291 Huy hiệu Đồng

rest_of_file = itertools.islice(Fhandle,index_of_interest,None,2)
for odd_line in rest_of_file:
    print odd_line

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

from itertools import dropwhile

def iterate_from_line(f, start_from_line):
    return (l for i, l in dropwhile(lambda x: x[0] < start_from_line, enumerate(f)))

for line in iterate_from_line(open(filename, "r", 0), 141978):
    DoSomethingWithThisLine(line)

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
First, pass through the whole file, and record the "seek-location" of some key-line-numbers (such as, ever 1000 lines),
Then if you want line 12005, jump to the position of 12000 (which you've recorded) then read 5 lines and you'll know you're in line 12005 and so on

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:

with open('input_file', "r+b") as f:
    mapped = mmap.mmap(f.fileno(), 0, prot=mmap.PROT_READ)
    i = 1
    for line in iter(mapped.readline, ""):
        if i == Line_I_want_to_jump:
            offsets = mapped.tell()
        i+=1

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

class LineSeekableFile:
    def __init__(self, seekable):
        self.fin = seekable
        self.line_map = list() # Map from line index -> file position.
        self.line_map.append(0)
        while seekable.readline():
            self.line_map.append(seekable.tell())

    def __getitem__(self, index):
        # NOTE: This assumes that you're not reading the file sequentially.  
        # For that, just use 'for line in file'.
        self.fin.seek(self.line_map[index])
        return self.fin.readline()

GeorgeGeorge

In: !cat /tmp/test.txt

Out:
Line zero.
Line one!

Line three.
End of file, line four.

In:
with open("/tmp/test.txt", 'rt') as fin:
    seeker = LineSeekableFile(fin)    
    print(seeker[1])
Out:
Line one!

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.

  • Bạn muốn dòng nào?.
  • Tính toán byte của số dòng tương ứng trong tệp chỉ mục (có thể vì kích thước dòng của tệp chỉ mục là không đổi).
  • Sử dụng tìm kiếm hoặc bất cứ điều gì để trực tiếp nhảy để có được dòng từ tệp chỉ mục.
  • Phân tích để nhận Byte Offset cho dòng tương ứng của tệp thực tế.

Đã 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 đó).

t = open(file,’r’)
dict_pos = {}

kolvo = 0
length = 0
for each in t:
    dict_pos[kolvo] = length
    length = length+len(each)
    kolvo = kolvo+1

Cuối cùng, chức năng AIM:

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
0

T.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ư "

line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line
0", thì phương pháp
line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line
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
line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line
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à

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
9. Nếu bạn không muốn đọc tất cả 15MB, bạn có thể sử dụng đối số
line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line
4 để ít nhất thay thế rất nhiều
line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line
5 với số lượng cuộc gọi nhỏ hơn đến
# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[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!
For me, this worked well!

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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

line = next(itertools.islice(Fhandle,index_of_interest,index_of_interest+1),None) # just the one line
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.

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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.

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
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:

# Read in the file once and build a list of line offsets
line_offset = []
offset = 0
for line in file:
    line_offset.append(offset)
    offset += len(line)
file.seek(0)

# Now, to skip to line n (with the first line being line 0), just do
file.seek(line_offset[n])
4

Đã trả lời ngày 19 tháng 9 năm 2015 lúc 22:05Sep 19, 2015 at 22:05

Hướng dẫn python jump to line in file - python nhảy đến dòng trong tệp

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.