Paramiko Загрузите, обработайте и повторно загрузите один и тот же файл - PullRequest
0 голосов
/ 11 ноября 2018

Я использую Paramiko для создания SFTP-клиента, чтобы создать резервную копию файла JSON, прочитать содержимое оригинала, а затем обновить (оригинал). Я могу заставить этот фрагмент кода работать:

# open sftp connection stuff

# read in json create backup copy - but have to 'open' twice
read_file = sftp_client.open(file_path)
settings = json.load(read_file)
read_file = sftp_client.open(file_path)  
sftp_client.putfo(read_file, backup_path)

# json stuff and updating
new_settings = json.dumps(settings, indent=4, sort_keys = True)

# update remote json file
with sftp_client.open(file_path, 'w') as f:
    f.write(new_settings)

Однако, когда я пытаюсь очистить код и объединить создание файла резервной копии и загрузку JSON:

with sftp_client.open(file_path) as f:
    sftp_client.putfo(f, backup_path)    
    settings = json.load(f)

Файл резервной копии будет создан, но json.load не удастся из-за отсутствия содержимого. И если я переверну порядок, json.load прочитает значения, но резервная копия будет пустой.

Я использую Python 2.7 на компьютере с Windows, создавая удаленное подключение к компьютеру с QNX (Linux). Цени любую помощь.

Заранее спасибо.

1 Ответ

0 голосов
/ 11 ноября 2018

Если вы хотите прочитать файл во второй раз, вам нужно искать указатель чтения файла обратно в начало файла:

with sftp_client.open(file_path) as f:
    sftp_client.putfo(f, backup_path)    
    f.seek(0, 0)
    settings = json.load(f)

Хотя это функционально эквивалентно вашему исходному коду с двумя open.


Если вы стремитесь оптимизировать код, чтобы избежать двойной загрузки файла, вам придется прочитать / кэшировать файл в память, а затем загрузить и загрузить содержимое из кэша.

f = BytesIO()
sftp_client.getfo(file_path, f)
f.seek(0, 0)
sftp_client.putfo(f, backup_path)    
f.seek(0, 0)
settings = json.load(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...