Tôi có một tệp mà tôi muốn nhận từng dòng cùng một lúc, nhưng một khi nó đến một dòng cụ thể, tôi cần có được một vài thông tin tiếp theo.
Đây là một mẫu mã:
rofile = open['foo.txt', 'r']
for line in rofile:
print line
if[line.strip[] == 'foo']:
line = line.next[]
print line
line = line.next[]
print line
line = line.next[]
print line
Khi tôi quay lại và lặp lần thứ hai, câu lệnh in đầu tiên đó sẽ in dòng thứ 5 trong tệp. Có cách nào có thể để làm điều này không?
Chỉnh sửa: Xin lỗi vì đã không làm rõ các chi tiết. rofile
là một đối tượng tệp mà tôi đang lặp lại. Liệu next[]
có phải là phương pháp thực để có được dòng tiếp theo khi sử dụng tệp hay không, tôi không biết. Tôi không có nhiều kinh nghiệm với thao tác tập tin trong Python.
Đã hỏi ngày 26 tháng 11 năm 2012 lúc 19:52Nov 26, 2012 at 19:52
Rob Avery Ivrob Avery IVRob Avery IV
3,4529 huy hiệu vàng47 Huy hiệu bạc71 Huy hiệu đồng9 gold badges47 silver badges71 bronze badges
2
Bạn có thể sử dụng iter
để chuyển đổi đối tượng của mình thành một thứ có thể hỗ trợ
irofile = iter[rofile]
for line in irofile:
print line
if[line == 'foo']:
line = next[irofile] #BEWARE, This could raise StopIteration!
print line
0.irofile = iter[rofile]
for line in irofile:
print line
if[line == 'foo']:
line = next[irofile] #BEWARE, This could raise StopIteration!
print line
Như đã chỉ ra trong các bình luận, nếu đối tượng của bạn đã là người lặp, thì bạn không cần phải lo lắng về iter
[đây là trường hợp với các đối tượng
irofile = iter[rofile]
for line in irofile:
print line
if[line == 'foo']:
line = next[irofile] #BEWARE, This could raise StopIteration!
print line
2]. Tuy nhiên, tôi để nó ở đây vì nó hoạt động cho trường hợp của bất kỳ sự khác biệt nào [ví dụ: irofile = iter[rofile]
for line in irofile:
print line
if[line == 'foo']:
line = next[irofile] #BEWARE, This could raise StopIteration!
print line
3s].Đã trả lời ngày 26 tháng 11 năm 2012 lúc 19:53Nov 26, 2012 at 19:53
Mgilsonmgilsonmgilson
290K61 Huy hiệu vàng608 Huy hiệu bạc676 Huy hiệu Đồng61 gold badges608 silver badges676 bronze badges
6
Tùy thuộc vào loại đối tượng mà rofile
là, tôi có thể nghĩ ra một vài cách để làm điều này.
Danh sách các chuỗi
Nếu bạn có thể nhận được nó chỉ đơn giản là một danh sách các chuỗi tạo nên các dòng của tệp:
for index, line in enumerate[rofile]:
if line == 'foo':
for a in range[index, index + HOW_MANY_LINES_YOU_WANT]:
print rofile[a]
Có thể lặp lại
Nếu tệp đã được điều đó có thể đi được:
for line in rofile:
print line
if line == 'foo':
for a in range[3]: # Just do it 3 times
print line.next[]
# After this happens and the for loop is restarted,
# it will print the line AFTER
Bạn có thể thấy trong ví dụ Quickie này, tôi đã viết rằng nó sẽ hoạt động theo cách này như một điều đáng tin cậy:
>>> k = iter[[1,2,3,4]]
>>> for a in k:
print 'start loop'
print a
if a == 2:
print 'in if'
print k.next[]
print 'end if'
print 'end loop'
start loop
1
end loop
start loop
2
in if
3
end if
end loop
start loop
4
end loop
Đã trả lời ngày 26 tháng 11 năm 2012 lúc 20:04Nov 26, 2012 at 20:04
JDOTJDOTJDOTJDOTjdotjdot
15.5K12 Huy hiệu vàng63 Huy hiệu bạc116 Huy hiệu đồng12 gold badges63 silver badges116 bronze badges
Đừng sử dụng vòng lặp
irofile = iter[rofile]
for line in irofile:
print line
if[line == 'foo']:
line = next[irofile] #BEWARE, This could raise StopIteration!
print line
5 nếu bạn không thực sự muốn làm điều gì đó cho mọi dòng. Một tùy chọn có thể là:try:
while True:
line = file.next[]
#do stuff
if line == 'foo':
#do other stuff
except[StopIteration]:
#go on with your life
Đã trả lời ngày 26 tháng 11 năm 2012 lúc 20:07Nov 26, 2012 at 20:07
PeterbbpeterbbPeterBB
3432 Huy hiệu bạc9 Huy hiệu Đồng2 silver badges9 bronze badges
4
Đây là một cách đơn giản để thực hiện nó cho một đối tượng tệp:
with open['foo.txt', 'r'] as rofile:
for line in rofile:
print line,
if line.strip[] == 'foo':
for _ in xrange[3]: # get the next 3 lines
try:
line = rofile.next[]
except StopIteration:
break
print line,
Việc cố gắng/ngoại trừ là cần thiết trong trường hợp không có 3 dòng nữa sau khi thấy dòng 'foo'.
Đã trả lời ngày 26 tháng 11 năm 2012 lúc 23:28Nov 26, 2012 at 23:28
Martineaumartineaumartineau
Huy hiệu vàng 116K2525 gold badges160 silver badges285 bronze badges
Tôi đã có một vấn đề tương tự và sử dụng câu lệnh
irofile = iter[rofile]
for line in irofile:
print line
if[line == 'foo']:
line = next[irofile] #BEWARE, This could raise StopIteration!
print line
6 thay vào đó hoạt động trong trường hợp của tôiĐã trả lời ngày 3 tháng 11 năm 2016 lúc 10:20Nov 3, 2016 at 10:20