1

こんにちは、ご覧いただきありがとうございます:)

2500 行を超えるテキスト タイルがあり、各行にはビデオ ファイルに関する情報が含まれています。タグの 1 つ (いわば) は監視状態用です。ある値から別の値に変更する方法、または設定されていない場合は新しい値を追加する方法を探しています。以下のコードは機能しますが、検索値ごとにファイルを開いたり閉じたりする必要があります。これは非常に遅いことを意味します。ファイルを一度開き、すべての検索を 1 回のパスで実行する方法を提案できる人はいますか?

ありがとう

for x in y:
    print '    --> ' + x['title'].encode('utf-8')

    searchValue = x['movieid']
    addValue = "\t_w\t1\t"
    checkvalue = "\t_w\t0\t"
    for line in fileinput.input(file, inplace=1):
        if searchValue in line:
            if checkvalue in line:
                line = line.replace(checkvalue, addValue)
            elif not addValue in line:
                line = line + addValue
        sys.stdout.write(line)

これが私が最終的に得たものです。皆様のご意見に感謝します。

    myfile_list = open(file).readlines()
    newList = []
    for line in myfile_list:
        for x in y:
            if x['movieid'] in line:
                print '    --> ' + x['title'].encode('utf-8')
                if checkvalue in line:
                    line = line.replace(checkvalue, addValue)
                elif not addValue in line:
                    line = line.replace('\n', addValue+'\n')
        newList.append(line)
    outref = open(file,'w')
    outref.writelines(newList)
    outref.close()

編集 エンコーディングの問題に遭遇しました。ファイルは utf-8 でエンコードされていますが、エラーが発生するか、検索値が

'Hannibal - S01E01 - Ap\xe9ritif.mkv'

ファイル内の一致する行は次のようになります

_F  /share/Storage/NAS/Videos/Tv/Hannibal/Season 01/Hannibal - S01E01 - Apéritif.mkv    _rt 43  _r  8.4 _s  1   _v  c0=h264,f0=24,h0=720,w0=1280    _IT 717ac9d _id 1671    _et Apéritif    _DT 7142d53 _FT 7142d53 _A  4212,4211,2533,4216 _C  T   _G  j|d|h|t _R  GB:TV-MA    _T  Hannibal    _U   thetvdb:259063 imdb:tt2243973  _V  HDTV    _W  4210    _Y  71  _ad 2013-04-04  _e  1   _ai Apéritif    _m  1117

codecs.open および decode().encode() オプションを試しましたが、常にエラーが発生します。行内のif searchValue を実行できるため、行内のアクセント付きの文字が問題であると考えています:行にない場合アクセントのある文字。これは私が現在試していることですが、他の方法も受け入れています。

if os.path.isfile("/share/Apps/oversight/index.db"):
    newfile = ""
    #searchValueFix = searchValue.decode('latin-1', 'replace').encode('utf8', 'replace')
    #print searchValueFix
    #print searchValue
    addValue = "\t_w\t1\t"
    replacevalue = "\t_w\t0\t"
    file = open("/share/Apps/oversight/index.db", "r")
    for line in file:
        if searchValue in line:
            if replacevalue in line:
                line = line.replace(replacevalue, addValue)
            elif not addValue in line:
                line = line.replace(searchValue+"\t", searchValue+addValue)
        newfile = newfile + line
    file.close()
    file = open("/share/Apps/oversight/index.db", "w")
    file.write(newfile)
    file.close()
    newfile = ""
4

2 に答える 2

1

PyNEwbie によって提案された方法と同様に、1 行ずつ書くことができます。

myfile_list = open(file).readlines()
outref = open(myfile, 'w')
for line in myfile_list:
    # do something to line
    outref.write(line)

outref.close()
于 2013-08-09T16:29:43.347 に答える
0

はい、あなたのファイルをリストに読み込みます

myfile_list = open(file).readlines()
newList = []
for line in myfile_list:
  .
  .

  newList.append(line)   # this is the line after you have made your changes
outref = open(myfile,'w')
 outref.writelines(newList)
outref.close()
于 2013-08-09T14:49:16.060 に答える