Python - запись в текстовом режиме в файл, открытый в двоичном режиме

Я спрашиваю это из любопытства.

Что я делаю:

  • создание временного файла
  • запись данных из кадра данных Pandas в него с помощью to_csv()
  • отправка файла на FTP-сервер

Поскольку 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().

Если кто-то имеет более глубокие знания об этом и может прояснить мою путаницу, я был бы очень благодарен. Я не люблю делать вещи, не зная, почему они работают или должны ли они работать, ха-ха.

Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
815
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это довольно широкий вопрос. Просто кратко. В основном это касается концов строк. Это в основном единственное различие между двоичным и текстовым режимами.

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

Другие вопросы по теме