0

出力ファイルが不完全な理由をテストするために、コードの最後にある write() メソッド行のすぐ隣に末尾の print() メソッドを配置しました。しかし、print() の出力は、私が期待する「すべてのもの」です。一方、write() の出力は紛らわしいほどオフになっています (200 個の「もの」のうち 150 個のみ)。出力の参照イメージ: IDLE と外部出力ファイル

参考までに: Win 7 64 // Python 3.4.2

私のモジュールは SRT キャプション ファイル ('test.srt') を受け取り、そこから作成したリスト オブジェクトを返します。特に、[[(index), [time], string]] の形式の 220 個のリスト エントリを持つもの。

times = open('times.txt', 'w')

### A portion of Riobard's SRT Parser: srt.py
import re

def tc2ms(tc):
    ''' convert timecode to millisecond '''

    sign    = 1
    if tc[0] in "+-":
        sign    = -1 if tc[0] == "-" else 1
        tc  = tc[1:]

    TIMECODE_RE     = re.compile('(?:(?:(?:(\d?\d):)?(\d?\d):)?(\d?\d))?(?:[,.](\d?\d?\d))?')
    match   = TIMECODE_RE.match(tc)
    try: 
        assert match is not None
    except AssertionError:
        print(tc)
    hh,mm,ss,ms = map(lambda x: 0 if x==None else int(x), match.groups())
    return ((hh*3600 + mm*60 + ss) * 1000 + ms) * sign

# my code
with open('test.srt') as f:
    file = f.read()

srt = []

for line in file:
    splitter = file.split("\n\n")

# SRT splitter
i = 0
j = len(splitter)
for items in splitter:
    while i <= j - 2:
        split_point_1 = splitter[i].index("\n")
        split_point_2 = splitter[i].index("\n", split_point_1 + 1)
        index = splitter[i][:split_point_1]
        time = [splitter[i][split_point_1:split_point_2]]
        time = time[0][1:]
        string = splitter[i][split_point_2:]
        string = string[1:]
        list = [[(index), [time], string]]
        srt += list
        i += 1

# time info outputter
i = 0
j = 1
for line in srt:
    if i != len(srt) - 1:
        indexer = srt[i][1][0].index(" --> ")
        timein = srt[i][1][0][:indexer]
        timeout = srt[i][1][0][-indexer:]
        line_time = (tc2ms(timeout) - tc2ms(timein))/1000
        space_time = ((tc2ms((srt[j][1][0][:indexer]))) - (tc2ms(srt[i][1][0][-indexer:])))/1000
        out1 = "The space between Line " + str(i) + " and Line " + str(j) + " lasts " + str(space_time) + " seconds." + "\n"
        out2 = "Line " + str(i) + ": " + str(srt[i][2]) + "\n\n"
        times.write(out1)
        times.write(out2)
        print(out1, end="")
        print(out2)
        i += 1
        j += 1
    else:
        indexer = srt[i][1][0].index(" --> ")
        timein = srt[i][1][0][:indexer]
        timeout = srt[i][1][0][-indexer:]
        line_time = (tc2ms(timeout) - tc2ms(timein))/1000
        outend = "Line " + str(i) + ": " + str(srt[i][2]) + "\n<End of File>"
        times.write(outend)
        print(outend)

私の 2 つの write() メソッドの出力ファイルは、それぞれ、220 項目のうち、150 項目または 200 項目のみを出力します。それ以外の場合は、正しく画面に出力されます。

4

1 に答える 1

1

書き込みが終わったらファイルを閉じたい。timesオペレーティング システムは書き込みバッファを使用してファイル I/O を高速化し、より大きなデータ ブロックを収集して一度にディスクに書き込みます。ファイルを閉じると、そのバッファがフラッシュされます。

times.close()

withファイルをブロックで開くことを検討してください。

with open('times.txt', 'w') as times:
    # all code that needs to write to times
于 2015-05-07T09:06:54.360 に答える