Ниже приведен раздел приложения, над которым я работаю. Раздел используется для обновления текстового файла с помощью addValue. Сначала я думал, что он работает, но он швы, чтобы добавить больше строк, а также очень медленно.Как ускорить разбор файлов в python?
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
Так что мой вопрос, есть ли более быстрый способ? Могу ли я загрузить файл в память (файл около 1 Мб), изменить нужные строки, а затем сохранить файл, или кто-нибудь может предложить другой метод, который ускорит работу.
Спасибо, что нашли время посмотреть.
EDIT Я изменил код довольно много, и это делает работу намного быстрее, но выход не как ожидалось, по какой-то причине он пишет 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
Вы пытаетесь использовать плоский файл в качестве базы данных? –
Файл используется в качестве базы данных другим приложением, но поскольку он по существу является текстовым файлом, я рассматривал его как таковой. Если есть лучший способ, я был бы очень полезен для любых советов. – jhmiller
Если вы выполняете много операций вставки/обновления. Я предлагаю вам использовать базу данных (возможно, SQLite) для выполнения вставок, а затем реализовать функцию «экспорта», которая делает SELECT * в вашей таблице и выгружает результат в файл. –