Я спрашиваю это из любопытства.
Что я делаю:
to_csv()Поскольку tempfile по умолчанию открывается в двоичном режиме, но метод to_csv() по умолчанию пишет в текстовом режиме (который мне нужен, потому что я хочу иметь UTF-8 в качестве формата), я спрашиваю себя, как вы можете писать в текстовом режиме в открытый файл в бинарном режиме? Мне также нужен двоичный формат для передачи на FTP-сервер.
Что я сделал подробно:
Я создал временный файл следующим образом:
fp = tempfile.NamedTemporaryFile(delete=False)
Как я понял из документации файл открывается в бинарном режиме.
tempfile.NamedTemporaryFile(режим='w+b', буферизация=-1, кодировка=Нет, новая строка=Нет, суффикс=Нет, префикс=Нет, каталог=Нет, удаление=Истина, *, ошибки=Нет)
Затем я сохранил свой фрейм данных во временный файл следующим образом:
df.to_csv(fp.name)
fp.flush()
fp.seek(0)
Также метод to_csv() в документации указывает, что вам нужно открыть файл с помощью newlines='', который работает только в текстовом режиме. Поэтому я не мог установить аргумент newline, используя файл, открытый в двоичном режиме.
path_or_bufstr или дескриптор файла, по умолчанию нет Путь к файлу или объект, если указано None, результат возвращается в виде строки. Если передан файловый объект, его следует открыть с помощью
newline='', отключив универсальные символы новой строки.
Затем я использовал метод storbinary() из ftplib, чтобы отправить временный файл на FTP-сервер. Как я понял из документации метод требует бинарный файл.
FTP.storbinary(cmd, fp, blocksize=8192, callback=None, rest=None) Сохраните файл в двоичном режиме передачи.
cmdдолжна быть соответствующейSTORкомандой:"STOR filename".fp— это файловый объект (открытый в бинарном режиме), который считывается до тех пор, пока не завершится EOF, используя свойread()метод в блоках размераblocksizeдля предоставления данных для сохранения. Аргументblocksizeпо умолчанию равен 8192.callback— это необязательный единственный вызываемый параметр, который вызывается для каждого блока данных после его отправки.restозначает то же самое, что и в методе transfercmd().
Для полноты картины я впоследствии закрыл и удалил файл следующим образом:
fp.close()
os.unlink(fp.name)
Я подумал об открытии tempfile в режиме w+t, чтобы он соответствовал методу to_csv(), который рекомендует открывать файл с помощью newlines='', который работает только в текстовом режиме. Также мне нужно указать формат UTF-8 для файла CSV, который работает только в текстовом режиме. Метод ftplib storbinary() требует, чтобы файл был открыт в двоичном режиме. (метод storlines() тоже подходит), так что это не подходит.
Поэтому я открыл файл в двоичном режиме, записал его в текстовом режиме и передал в двоичном режиме. Все работает, и результат выглядит так, как я этого хочу, но я немного сбит с толку, правильно ли я это делаю. Как работает запись в текстовом режиме в файл, открытый в двоичном режиме? Я как бы предполагал, что мне придется открыть файл в текстовом режиме, чтобы писать в него в текстовом режиме, используя to_csv().
Если кто-то имеет более глубокие знания об этом и может прояснить мою путаницу, я был бы очень благодарен. Я не люблю делать вещи, не зная, почему они работают или должны ли они работать, ха-ха.
Спасибо!






Это довольно широкий вопрос. Просто кратко. В основном это касается концов строк. Это в основном единственное различие между двоичным и текстовым режимами.
\n) преобразуются в соответствии с параметром newline.line_terminatorstr параметр DataFrame.to_csv.storbinary, файл будет загружен как есть. Если вы используете storlines, вы позволяете FTP-серверу преобразовывать окончания строк.