Подтвердить что ты не робот

Файл Python открывается/закрывается каждый раз, пока он не будет открыт до завершения процесса

У меня около 50 ГБ текстового файла, и я проверяю первые несколько символов каждой строки и записываю их в другие файлы, указанные для этого начального текста.

Например.  мой вход содержит:

cow_ilovecow
dog_whreismydog
cat_thatcatshouldgotoreddit
dog_gotitfromshelter
...............

Итак, я хочу обработать их в категориях коров, собак и кошек (около 200) поэтому

if writeflag==1:
    writefile1=open(writefile,"a") #writefile is somedir/dog.txt....
    writefile1.write(remline+"\n")
    #writefile1.close()

Итак, что лучше всего, я должен закрыть? В противном случае, если я держу его открытым, writefile1=open(writefile,"a") поступает правильно?

4b9b3361

Ответ 1

Вы должны обязательно попытаться открыть/закрыть файл как можно меньше

Потому что даже по сравнению с чтением/записью файла, открытие/закрытие файла намного дороже

Рассмотрим два блока кода:

f=open('test1.txt', 'w')
for i in range(1000):
    f.write('\n')
f.close()

а также

for i in range(1000):
    f=open('test2.txt', 'a')
    f.write('\n')
    f.close()

Первый занимает 0,025 с, второй - 0,309 с

Ответ 2

Используйте оператор with, он автоматически закрывает файлы для вас, выполняет все операции внутри блока with, поэтому он будет держать файлы открытыми для вас и закроет файлы, как только вы выйдете из блок with.

with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3:
   #do something here

EDIT: Если вы знаете все возможные имена файлов, которые будут использоваться до компиляции вашего кода, то использование with является лучшим вариантом, и если вы этого не сделаете, вы должны использовать свой подход, но вместо закрытия файла вы можете flush данных к файлу с помощью writefile1.flush()

Ответ 3

Держите его открытым все время! В противном случае вы сообщаете системе, что вы все время пишете, и может решить сбросить ее на диск, а не буферизировать. И по очевидным причинам n записи на диске намного дороже, чем 1 запись на диск.

Если вы хотите добавить в файл и не перезаписать его, тогда да, a - правильный режим.

Ответ 4

Операции ввода-вывода потребляют слишком много времени. Откройте и закройте файл.

Это намного быстрее, если вы открываете оба файла (вход и выход), используйте буфер памяти, допустим, размер 10 МБ для вашей текстовой обработки, а затем записывайте это в выходной файл. Например:

file = {} # just initializing dicts
filename = {}
with open(file) as f:
    file['dog'] = None
    buffer = ''
    ...
    #maybe there is a loop here
    if writeflag:
        if file['dog'] == None:
            file['dog'] = open(filename['dog'], 'a')
        buffer += remline + '\n'
    if len(buffer) > 1024*1000*10: # 10MB of text
       files['dog'].write(buffer)
       buffer = ''

for v in files.values():
    v.close()