Написать в файл в точное положение - PullRequest
1 голос
/ 04 февраля 2020

Моя основная задача - записать в один файл (например, file.txt) во многих параллельных потоках, каждый поток должен начинаться с определенного смещения файла.

Пример:
скрипт 1 - пишет 10 символов с позиции 0
скрипт 2 - пишет 10 символов с позиции 10
скрипт 3 - пишет 10 символов с позиции 20

Я даже не дошел до параллелизм, потому что я застрял при записи в различные смещения файла. Я создал простой скрипт для проверки моей идеи:

file = open("sample_file.txt", "w")
file.seek(100)
file.write("new line")

file.close()

Хорошо, файл создан, смещение было перемещено в 100 и добавлено предложение 'new line'. Успех.

Но тогда я хотел открыть тот же файл и добавить что-то с помощью offsett 10:

file = open("sample_file.txt", "w")
file.seek(100)
file.write("new line")
file.close()

file = open("sample_file.txt", "a")
file.seek(10)
file.write("second line")
file.close()

И предложение 'second line' добавляется, но в конце файла . Я уверен, что можно добавить символы где-то в середине файла. Кто-нибудь может помочь с этим простым?

Или, может быть, у кого-то есть идея, как сделать это параллельно?

Pawel

1 Ответ

3 голосов
/ 04 февраля 2020

Как подсказывает этот пост , открытие файла в режиме 'a' будет:

Открыть для записи. Файл создается, если он не существует. Поток располагается в конце файла. Последующие записи в файл всегда заканчиваются на текущем конце файла, независимо от какого-либо промежуточного fseek (3) или аналогичного.

С другой стороны, режим 'r+' позволит вам:

Открыть для чтения и письма. Поток располагается в начале файла.

И хотя это явно не упомянуто, этот позволит вам seek файл и записать в разные позиции


В любом случае, если вы собираетесь делать это параллельно, вам придется контролировать ресурсы. Вы не хотите, чтобы 2 процесса записывали в файл одновременно. Что касается этой проблемы, см. этот вопрос SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...