下面是我一直在开发的应用程序的一部分。该部分用于使用 addValue 更新文本文件。起初我认为它正在工作,但它接缝添加了更多的线条,而且它非常非常慢。
trakt_shows_seen 是一个节目字典,1 个节目部分看起来像
{'episodes': [{'season': 1, 'playcount': 0, 'episode': 1}, {'season': 1, 'playcount': 0, 'episode': 2}, {'season': 1, 'playcount': 0, 'episode': 3}], 'title': 'The Ice Cream Girls'}
该部分应搜索文件中的每个标题,季节和剧集,并在找到时检查它是否有观看标记(checkValue),如果有,则将其更改为 addvalue,如果没有,则应将 addValue 添加到末尾线。
文件中的一行
_F /share/Storage/NAS/Videos/Tv/The Ice Cream Girls/Season 01/The Ice Cream Girls - S01E01 - Episode 1.mkv _ai Episode 1 _e 1 _r 6.5 _Y 71 _s 1 _DT 714d861 _et Episode 1 _A 4379,4376,4382,4383 _id 2551 _FT 714d861 _v c0=h264,f0=25,h0=576,w0=768 _C T _IT 717ac9d _R GB: _m 1250 _ad 2013-04-19 _T The Ice Cream Girls _G d _U thetvdb:268910 imdb:tt2372806 _V HDTV
所以我的问题是,有没有更好更快的方法?我可以将文件加载到内存中(文件大约 1Mb)更改所需的行然后保存文件,或者任何人都可以建议另一种可以加快速度的方法。
感谢您花时间查看。
编辑 我已经对代码进行了相当多的更改,这确实工作得更快,但输出并不像预期的那样,由于某种原因,即使没有代码来执行此操作,它也会将lines_of_interest 写入文件?
我还没有添加任何编码选项,但由于文件是 utf-8,我怀疑重音标题会有问题。
if trakt_shows_seen:
addValue = "\t_w\t1\t"
replacevalue = "\t_w\t0\t"
with open(OversightFile, 'rb') as infile:
p = '\t_C\tT\t'
for line in infile:
if p in line:
tv_offset = infile.tell() - len(line) - 1#Find first TV in file, search from here
break
lines_of_interest = set()
for show_dict in trakt_shows_seen:
for episode in show_dict['episodes']:
p = re.compile(r'\t_s\t('+str(episode["season"])+')\t.*\t_T\t('+show_dict["title"]+')\t.*\t_e\t('+str(episode["episode"])+')\t')
infile.seek(tv_offset)#search from first Tv show
for line in infile:
if p.findall(line):
search_offset = infile.tell() - len(line) - 1
lines_of_interest.add(search_offset)#all lines that need to be changed
with open(OversightFile, 'rb+') as outfile:
for lines in lines_of_interest:
for change_this in outfile:
outfile.seek(lines)
if replacevalue in change_this:
change_this = change_this.replace(replacevalue, addValue)
outfile.write(change_this)
break#Only check 1 line
elif not addValue in change_this:
#change_this.extend(('_w', '1'))
change_this = change_this.replace("\t\n", addValue+"\n")
outfile.write(change_this)
break#Only check 1 line