如何查找文件中的特定行?
How to seek to a specific line in a file?
我有一个文本文件如下:
1
/run/media/dsankhla/Entertainment/English songs/Apologise (Feat. One Republic).mp3
3
/run/media/dsankhla/Entertainment/English songs/Bad Meets Evil.mp3
5
/run/media/dsankhla/Entertainment/English songs/Love Me Like You DO.mp3
我想在文件中搜索特定行假设该行是
song_path = "/run/media/dsankhla/Entertainment/English songs/Bad Meets Evil.mp3"
然后我想寻找 len(song_path)+2
BEHIND 以便我可以指向文件中的 3
。我该怎么做?
到目前为止,这是我的代码:
txt = open(".songslist.txt", "r+")
if song_path in txt.read():
byte = len(song_path)
txt.seek(-(byte), 1)
freq = int(txt.readline())
print freq # 3
freq = freq + 1
txt.seek(-2,1)
txt.write(str(freq))
txt.close()
最好的方法是使用搜索,如本例所示:
fp = open('myfile')
last_pos = fp.tell()
line = fp.readline()
while line != '':
if line == 'SPECIAL':
fp.seek(last_pos)
change_line()#whatever you must to change
break
last_pos = fp.tell()
line = fp.readline()
您必须使用fp.tell
将位置值分配给变量。然后用 fp.seek
你可以倒退。
如果您的文件不是太大(太大而无法放入内存,read/write 相当慢)您可以绕过任何 "low level" 操作,例如搜索并完全读取您的文件,更改你想改变什么,然后写回所有内容。
# read everything in
with open(".songslist.txt", "r") as f:
txt = f.readlines()
# modify
path_i = None
for i, line in enumerate(txt):
if song_path in line:
path_i = i
break
if path_i is not None:
txt[path_i] += 1 # or what ever you want to do
# write back
with open(".songslist.txt", "w") as f:
f.writelines(txt)
使用seek
时注意不要写"byte perfekt",即:
f = open("test", "r+")
f.write("hello world!\n12345")
f.seek(6) # jump to the beginning of "world"
f.write("1234567") # try to overwrite "world!" with "1234567"
# (note that the second is 1 larger then "world!")
f.seek(0)
f.read() # output is now "hello 123456712345" note the missing newline
我有一个文本文件如下:
1
/run/media/dsankhla/Entertainment/English songs/Apologise (Feat. One Republic).mp3
3
/run/media/dsankhla/Entertainment/English songs/Bad Meets Evil.mp3
5
/run/media/dsankhla/Entertainment/English songs/Love Me Like You DO.mp3
我想在文件中搜索特定行假设该行是
song_path = "/run/media/dsankhla/Entertainment/English songs/Bad Meets Evil.mp3"
然后我想寻找 len(song_path)+2
BEHIND 以便我可以指向文件中的 3
。我该怎么做?
到目前为止,这是我的代码:
txt = open(".songslist.txt", "r+")
if song_path in txt.read():
byte = len(song_path)
txt.seek(-(byte), 1)
freq = int(txt.readline())
print freq # 3
freq = freq + 1
txt.seek(-2,1)
txt.write(str(freq))
txt.close()
最好的方法是使用搜索,如本例所示:
fp = open('myfile')
last_pos = fp.tell()
line = fp.readline()
while line != '':
if line == 'SPECIAL':
fp.seek(last_pos)
change_line()#whatever you must to change
break
last_pos = fp.tell()
line = fp.readline()
您必须使用fp.tell
将位置值分配给变量。然后用 fp.seek
你可以倒退。
如果您的文件不是太大(太大而无法放入内存,read/write 相当慢)您可以绕过任何 "low level" 操作,例如搜索并完全读取您的文件,更改你想改变什么,然后写回所有内容。
# read everything in
with open(".songslist.txt", "r") as f:
txt = f.readlines()
# modify
path_i = None
for i, line in enumerate(txt):
if song_path in line:
path_i = i
break
if path_i is not None:
txt[path_i] += 1 # or what ever you want to do
# write back
with open(".songslist.txt", "w") as f:
f.writelines(txt)
使用seek
时注意不要写"byte perfekt",即:
f = open("test", "r+")
f.write("hello world!\n12345")
f.seek(6) # jump to the beginning of "world"
f.write("1234567") # try to overwrite "world!" with "1234567"
# (note that the second is 1 larger then "world!")
f.seek(0)
f.read() # output is now "hello 123456712345" note the missing newline