Python – одновременный поиск и запись файловPython

Программы на Python
Ответить
Anonymous
 Python – одновременный поиск и запись файлов

Сообщение Anonymous »

Я создаю одновременный загрузчик файлов, который загружает файлы по сегментам и затем объединяет их. Я хочу улучшить его, предварительно создав большой файл полного размера, тогда каждый поток будет искать соответствующее ему начальное смещение и писать.
Я гуглил и пробовал разные способы. Ни один из них не сработал.
Упрощенный код:

Код: Выделить всё

from random import shuffle
from threading import Lock, Thread

lock = Lock()

def writer(i):
with lock:
with open("2.txt", "wb") as f:
f.seek(i)
f.write(f"{i}".encode("utf-8"))
f.flush()

def test():
# Pre-create the file
with open("2.txt", "wb") as f:
f.seek(7)
f.write(b"\0")
f.flush()

# Spawn and execute the threads in randomized order
# to mimic the concurrent downloader
threads = [Thread(target = writer, args = (i, )) for i in range(8)]
shuffle(threads)
[t.start() for t in threads]
[t.join() for t in threads]
# Read the result
with open("2.txt", "rb") as f:
print(f.read())

if __name__ == "__main__":
for _ in range(5):
test()
Этот код записывает файл с помощью «wb» в функции записи и дает следующий результат:

Код: Выделить всё

[pairman@pairface bw]$ python test.py
b'\x00\x00\x00\x00\x005'
b'\x00\x00\x00\x00\x005'
b'\x00\x00\x00\x00\x00\x00\x007'
b'\x00\x002'
b'\x001'
Как видно, «wb» перезаписывает файл, если он существует, что не удовлетворяет мои потребности. Если я изменю «wb» на «ab», поиск не будет работать, и потоки записи просто добавятся в случайном порядке:

Код: Выделить всё

[pairman@pairface bw]$ python test.py
b'\x00\x00\x00\x00\x00\x00\x00\x0062045173'
b'\x00\x00\x00\x00\x00\x00\x00\x0073502146'
b'\x00\x00\x00\x00\x00\x00\x00\x0005432716'
b'\x00\x00\x00\x00\x00\x00\x00\x0024036751'
b'\x00\x00\x00\x00\x00\x00\x00\x0052046317'
Итак, есть ли способ одновременно открывать, искать и записывать в файл файл?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -and-write
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»