【发布时间】:2019-02-06 08:16:10
【问题描述】:
如何在 FTP 服务器上以写入模式打开文件?我知道我可以直接写入/创建文件(当我有数据时),但我想先打开它进行写入,然后才能像在本地使用 contextmanager 那样写入它。
原因是,我想创建具有统一方法的接口来与传输协议服务器一起工作。特别是 SFTP 和 FTP。
所以使用 SFTP 很容易(使用 paramiko):
def open(sftp, fname, mode='r'):
return sftp.open(fname, mode=mode)
现在我可以这样做了:
with open(sftp, 'some_file.txt', 'w') as f:
f.write(data)
然后我可以阅读所写的内容
with open(sftp, 'some_file.txt', 'r') as f:
print(f.read().decode('utf-8'))
如何为 FTP 执行相同的实现(使用 ftplib)?
FTP的读取部分,我能够实现并且可以像使用SFTP一样以读取模式打开文件。但是我怎样才能在写模式下打开它呢? ftplib 方法storbinary 要求“立即”提供数据。我的意思是我应该已经通过open 方法传递了我想写入的数据(但它会破坏统一方法的目的)?
import io
def open(ftp, filename, mode='r'):
"""Open a file on FTP server."""
def handle_buffer(buffer_data):
bio.write(buffer_data)
# Reading implementation
if mode == 'r':
bio = io.BytesIO()
ftp.retrbinary(
'RETR %s' % filename, callback=handle_buffer)
bio.seek(0)
return bio
# Writing implementation.
if mode == 'w':
# how to open in write mode?
更新
假设我们在 FTP 中有即时编写实现:
bio = io.BytesIO
# Write some data
data = csv.writer(bio)
data.writerows(data_to_export)
bio.seek(0)
# Store. So it looks like storbinary does not open file in w mode, it does everything in one go?
ftp.storbinary("STOR " + file_name, sio)
所以问题是如何将写入数据与仅以写入模式打开文件分开。 ftplib 甚至可以吗?
【问题讨论】:
-
ftp.storbinary 也许?
-
@Will 这是一个错字,我的意思是 storbinary ..:)
-
@Ephemeral 这与访问有什么关系?我知道如何在 ftp 中写入,但我想先打开文件进行写入。
-
不确定这是否有意义。 open 应该给你一个文件句柄,你可以调用它的方法(比如读和写)。您在“r”模式下的打开已经读取了文件。为什么不尝试创建一个继承 io.IOBase 的类并提供您自己的读/写/关闭方法,然后在“打开”中使用它?
-
@Ephemeral 抱歉,我不是想侮辱你。只是不明白你为什么带来访问权限。
标签: python python-3.x file-writing ftplib