41
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi đang duyệt qua một con trỏ tệp Python của một tệp văn bản ở chế độ chỉ đọc bằng File.Readline [] Tìm kiếm một dòng đặc biệt. Khi tôi tìm thấy dòng đó, tôi muốn chuyển con trỏ tệp đến một phương thức mong đợi con trỏ tệp sẽ ở đầu dòng đọc đó [không phải ngay sau khi nó.]
Làm thế nào để tôi thực chất hoàn tác một tệp.readline [] trên một con trỏ tệp?
CodeForester
359K16 Huy hiệu vàng102 Huy hiệu bạc126 Huy hiệu đồng16 gold badges102 silver badges126 bronze badges
Hỏi ngày 17 tháng 8 năm 2010 lúc 18:02Aug 17, 2010 at 18:02
Bạn phải nhớ vị trí bằng cách gọi file.tell[]
trước khi đọc và sau đó gọi file.seek[]
để tua lại. Cái gì đó như:
fp = open['myfile']
last_pos = fp.tell[]
line = fp.readline[]
while line != '':
if line == 'SPECIAL':
fp.seek[last_pos]
other_function[fp]
break
last_pos = fp.tell[]
line = fp.readline[]
Tôi không thể nhớ lại nếu an toàn khi gọi file.seek[]
bên trong vòng lặp for line in file
vì vậy tôi thường chỉ viết vòng lặp while
. Có lẽ có một cách làm điều này nhiều hơn.
Đã trả lời ngày 17 tháng 8 năm 2010 lúc 18:08Aug 17, 2010 at 18:08
D.ShawleyD.ShawleyD.Shawley
57.1K10 Huy hiệu vàng96 Huy hiệu bạc112 Huy hiệu đồng10 gold badges96 silver badges112 bronze badges
1
Bạn ghi lại điểm bắt đầu của dòng với
>>> with open['bah.txt', 'w'] as f:
... f.writelines['Hello %s\n' % i for i in range[5]]
...
>>> with open['bah.txt'] as f:
... f.readline[]
... x = f.tell[]
... f.readline[]
... f.seek[x]
... f.readline[]
...
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>>
0 trước khi bạn gọi >>> with open['bah.txt', 'w'] as f:
... f.writelines['Hello %s\n' % i for i in range[5]]
...
>>> with open['bah.txt'] as f:
... f.readline[]
... x = f.tell[]
... f.readline[]
... f.seek[x]
... f.readline[]
...
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>>
1 và quay lại điểm đó, nếu bạn cần, với >>> with open['bah.txt', 'w'] as f:
... f.writelines['Hello %s\n' % i for i in range[5]]
...
>>> with open['bah.txt'] as f:
... f.readline[]
... x = f.tell[]
... f.readline[]
... f.seek[x]
... f.readline[]
...
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>>
2.>>> with open['bah.txt', 'w'] as f:
... f.writelines['Hello %s\n' % i for i in range[5]]
...
>>> with open['bah.txt'] as f:
... f.readline[]
... x = f.tell[]
... f.readline[]
... f.seek[x]
... f.readline[]
...
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>>
Như bạn thấy, tìm kiếm/nói "cặp" là "hoàn tác", có thể nói, chuyển động con trỏ tệp được thực hiện bởi
>>> with open['bah.txt', 'w'] as f:
... f.writelines['Hello %s\n' % i for i in range[5]]
...
>>> with open['bah.txt'] as f:
... f.readline[]
... x = f.tell[]
... f.readline[]
... f.seek[x]
... f.readline[]
...
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>>
1. Tất nhiên, điều này chỉ có thể hoạt động trên một tệp tìm kiếm thực tế [tức là, đĩa], không [ví dụ] trên các đối tượng giống như tệp được xây dựng với phương thức makefile của ổ cắm, v.v.Đã trả lời ngày 17 tháng 8 năm 2010 lúc 18:09Aug 17, 2010 at 18:09
Alex Martellialex MartelliAlex Martelli
826K163 Huy hiệu vàng1203 Huy hiệu bạc1382 Huy hiệu Đồng163 gold badges1203 silver badges1382 bronze badges
Nếu phương thức của bạn chỉ đơn giản muốn lặp lại thông qua tệp, thì bạn có thể sử dụng
>>> with open['bah.txt', 'w'] as f:
... f.writelines['Hello %s\n' % i for i in range[5]]
...
>>> with open['bah.txt'] as f:
... f.readline[]
... x = f.tell[]
... f.readline[]
... f.seek[x]
... f.readline[]
...
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>>
4 để tạo một trình lặp phù hợp:import itertools
# do something to the marker line and everything after
def process[it]:
for line in it:
print line,
with open[filename,'r'] as f:
for line in f:
if 'marker' in line:
it=itertools.chain[[line,],f]
process[it]
break
idbrii
10,4K5 Huy hiệu vàng59 Huy hiệu bạc100 Huy hiệu đồng5 gold badges59 silver badges100 bronze badges
Đã trả lời ngày 17 tháng 8 năm 2010 lúc 18:10Aug 17, 2010 at 18:10
UnutbuUnutbuunutbu
800K172 Huy hiệu vàng1724 Huy hiệu bạc1625 Huy hiệu Đồng172 gold badges1724 silver badges1625 bronze badges
0
fin = open['myfile']
for l in fin:
if l == 'myspecialline':
# Move the pointer back to the beginning of this line
fin.seek[fin.tell[] - len[l]]
break
# now fin points to the start of your special line
Đã trả lời ngày 17 tháng 8 năm 2010 lúc 18:11Aug 17, 2010 at 18:11
GWWGWWGWW
42.1k11 Huy hiệu vàng110 Huy hiệu bạc107 Huy hiệu đồng11 gold badges110 silver badges107 bronze badges
3
Nếu bạn không biết dòng cuối cùng vì bạn không truy cập nó, bạn có thể đọc ngược cho đến khi bạn thấy một ký tự mới:
with open[logfile, 'r'] as f:
# go to EOF
f.seek[0, os.SEEK_END]
nlines = f.tell[]
i=0
while True:
f.seek[nlines-i]
char = f.read[1]
if char=='\n':
break
i+=1
Đã trả lời ngày 28 tháng 8 năm 2018 lúc 13:39Aug 28, 2018 at 13:39
JltjltJLT
6828 Huy hiệu bạc15 Huy hiệu Đồng8 silver badges15 bronze badges