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

Python-以文本模式写入以二进制模式打开的文件,python,pandas,csv,ftp,ftplib,Python,Pandas,Csv,Ftp,Ftplib,我问这个是出于好奇 我在做什么: 创建临时文件 使用将数据帧中的数据写入csv() 将文件推送到FTP服务器 由于默认情况下,tempfile以二进制模式打开,但默认情况下,to_csv()方法以文本模式写入(我需要文本模式,因为我希望以UTF-8为格式),我问自己,如何以文本模式写入以二进制模式打开的文件?我还需要传输到FTP服务器的二进制格式 我所做的详细说明: 我创建了一个临时文件,如下所示: fp = tempfile.NamedTemporaryFile(delete=False)

我问这个是出于好奇

我在做什么:

  • 创建临时文件
  • 使用
    将数据帧中的数据写入csv()
  • 将文件推送到FTP服务器
由于默认情况下,
tempfile
以二进制模式打开,但默认情况下,
to_csv()
方法以文本模式写入(我需要文本模式,因为我希望以UTF-8为格式),我问自己,如何以文本模式写入以二进制模式打开的文件?我还需要传输到FTP服务器的二进制格式

我所做的详细说明:

我创建了一个临时文件,如下所示:

fp = tempfile.NamedTemporaryFile(delete=False)
df.to_csv(fp.name)
fp.flush()
fp.seek(0)
fp.close()
os.unlink(fp.name)
当我从数据库中卸载时,文件以二进制模式打开

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

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

fp = tempfile.NamedTemporaryFile(delete=False)
df.to_csv(fp.name)
fp.flush()
fp.seek(0)
fp.close()
os.unlink(fp.name)
另外,
to_csv()
方法在中指出,您需要使用仅在文本模式下工作的
换行符='
打开文件。因此,我无法使用以二进制模式打开的文件设置
换行符
参数

路径\或\ bufstr或文件句柄,默认为无 文件路径或对象,如果未提供,则结果将作为字符串返回。如果传递了文件对象,则应使用
换行符=''
打开该文件对象,禁用通用换行符

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

storbinary(cmd,fp,blocksize=8192,callback=None,rest=None) 以二进制传输模式存储文件
cmd
应该是一个合适的
STOR
命令:
“STOR filename”
fp
是一个文件对象(以二进制模式打开),使用其
read()。
blocksize
参数默认为8192
callback
是一个可选的可调用的单参数,在发送数据块后对其进行调用
rest
与transfercmd()方法中的含义相同

为了完整起见,我随后关闭并删除了该文件,如下所示:

fp = tempfile.NamedTemporaryFile(delete=False)
df.to_csv(fp.name)
fp.flush()
fp.seek(0)
fp.close()
os.unlink(fp.name)
我考虑在
w+t
模式下打开
tempfile
,以便它与
to_csv()
方法相匹配,该方法建议使用仅在文本模式下工作的
newlines=''
打开文件。此外,我需要为CSV文件指定UTF-8格式,该文件仅在文本模式下工作。ftplib的
storbinary()
方法需要以二进制模式打开文件。(
storlines()
方法也会这样做),因此这不适合

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

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


谢谢

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

  • 如果以二进制模式“打开”文件,则所有数据都会按原样写入。如果以文本模式打开文件,则换行符(
    \n
    )将根据
    换行符
    参数进行转换
  • 我认为熊猫不需要以文本模式打开文件。如果以二进制模式打开文件,则Pandas写入的任何内容都将在文件中物理结束。请参阅的
    行_terminatorstr
    参数
  • 这与FTP基本相同。如果使用
    storbinary
    ,文件将按原样上载。如果使用
    存储行
    ,则可以让FTP服务器转换行的结尾