Python - 以文本模式写入以二进制模式打开的文件

Python - Write in text mode to file opened in binary mode

出于好奇,我问这个问题。

我在做什么:

因为 tempfile 默认以二进制模式打开,但 to_csv() 方法默认以文本模式写入(我需要它,因为我想使用 UTF-8 作为格式)我是问自己如何以文本模式写入以二进制模式打开的文件?我还需要传输到 FTP 服务器的二进制格式。

我详细做了什么:

我创建了一个这样的临时文件:

fp = tempfile.NamedTemporaryFile(delete=False)

据我所知,documentation 文件以二进制模式打开。

tempfile.NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, delete=True, *, errors=None)

然后我将数据框保存到临时文件中,如下所示:

df.to_csv(fp.name)
fp.flush()
fp.seek(0)

此外,to_csv() 方法在 documentation 中声明您需要使用 newlines='' 打开文件,这仅适用于文本模式。所以我无法使用以二进制模式打开的文件设置 newline 参数。

path_or_bufstr or file handle, default None File path or object, if None is provided the result is returned as a string. If a file object is passed it should be opened with newline='', disabling universal newlines.

然后我使用 ftplib 中的 storbinary() 方法将临时文件推送到 FTP 服务器。据我所知,documentation 该方法需要一个二进制文件。

FTP.storbinary(cmd, fp, blocksize=8192, callback=None, rest=None) Store a file in binary transfer mode. cmd should be an appropriate STOR command: "STOR filename". fp is a file object (opened in binary mode) which is read until EOF using its read() method in blocks of size blocksize to provide the data to be stored. The blocksize argument defaults to 8192. callback is an optional single parameter callable that is called on each block of data after it is sent. rest means the same thing as in the transfercmd() method.

为了完整起见,我之后关闭并删除了这样的文件:

fp.close()
os.unlink(fp.name)

我考虑过以w+t模式打开tempfile,使其匹配to_csv()方法,建议使用newlines=''打开文件,仅适用于文本模式。我还需要为 CSV 文件指定 UTF-8 格式,它只能在文本模式下工作。 ftplib 的 storbinary() 方法需要一个以二进制模式打开的文件。 (storlines() 方法也适用)所以这不适合。

所以我以二进制模式打开文件,以文本模式写入文件并使用二进制模式传输。一切正常,结果看起来像我想要的,但如果我以正确的方式做,我会有点困惑。以文本模式写入以二进制模式打开的文件如何工作?我有点假设我必须以文本模式打开文件才能使用 to_csv().

以文本模式写入文件

如果有人对此有更深入的了解并可以消除我的困惑,我将不胜感激。我不喜欢做一些不知道为什么有效或是否应该有效的事情哈哈。

谢谢!

这是一个相当宽泛的问题。只是简单地说。这主要是关于行尾。这基本上是二进制和文本模式之间的唯一区别。

  • 如果您以二进制模式“打开”一个文件,所有数据都将原封不动地写入。如果以文本模式打开文件,换行符(\n)会根据newline参数进行转换。
  • 我认为Pandas不需要以文本模式打开文件。如果您以二进制模式打开文件,那么 Pandas 写入的任何内容都将物理地保存在文件中。请参阅 DataFrame.to_csvline_terminatorstr 参数。
  • 与FTP大致相同。如果您使用 storbinary,文件将按原样上传。如果使用 storlines,则让 FTP 服务器转换行结尾。