r - 使用 R 从序列化的内容字符串创建 .tar.gz 文件
问题描述
给定我硬盘上的一个.tar.gz
文件,想创建那个确切的文件,但只使用 R 代码(例如,在序列化的帮助下)。目标不是引用文件本身,而是生成一个包含文件内容的纯文本变量,然后将文件写入文件系统。我想到了以下几点:
- 取文件的base64字符串(base64序列化)。
- 将其作为二进制文件写入文件系统。
但是下面的代码会生成一个空文件:
zzfil <- tempfile("testfile")
zz <- file(zzfil, "wb")
file_content <- "H4sIAAAAAAAAA+1YbW/bNhD2Z/6KW/zBNpLIerHjQmvapo6HBWgyw3ZXDE1X0BJtEZFIgaTguEb/+06S7drJumJA5m6DHsAQxOM9PPF4uscyTJuUBnd0zmzbaV8Oxv3R1XBy9ctN7clgI846nfzq9Lr27rVAr2fXHM+zvV6303N6NdvxHDSDXTsAMm2owlDE/K/nfcv+H8WwzL0PZu8gkMkyxcG1lUy4ifH2XUQNmIhtxuFSMg3Nwgp9qlmL/MqU5lL4YFuOZZOLzERS5Z4SFkoaBtyQa8qFwR9DwwTZ1stCsh2H50uZKc3i2SstE7aImGKWYOYFuWQ6UDw1xRrXUjGgU5kZWOShcQNhEVFCl1Pky80mogKkYBAjcYsA4q1mMEN+0LgyTkd6AVyETBgu5hiOonNF0wgt3ERcFI+8s7BF3vCACb3Zkbi8A67zCDIkUi/JQAQyRDof3k5+On2GgadMhNqHETRfnINndSyvRa6SVCqDo/N5GkvjFjbXci2ndQKGT6e4sfmQg9PdFnlDPy0vqaGYLpUxcsNYqPsySXlMyx0RkqxzE/rg2s6zU7t76jngOL7T870uBtP/EcScbPK/n/b2zcX1YDy86A+e8ox9q/6x8Mv6d92eZztY/+6Z163q/xBg9/kBHFJjmBLNo9/fv/dpnEbU//Dh+KhFahX+33hQ/6P2P7BG0eO73a/Xv20/qH/nDGUAdKv6P3z+IxbH0hod8P2P2T5b59/zOo6d6z+706ve/4dAHX7OE34CC6ni8AdSJ3XUZLmS0YDCid3TJEUNMstEkCsMEDRhITSKU9LAuYuIBxGkCpWbhsYeV8Mq2H6TGQRIFTOqRKnJSsm2kX200Ii58srlFozGJgu5BGr8wh8gMib12211mt7NtRXR0AqkJT61C/MY9SFkms2yGO7YciqpCkEjoQkyDGkm1eOFNsSvMx6H+JghjFgsaQhbNQyNvlExHMM44jOD19eNwqMfseBuZ9oOHnoMSo8JFtifOzzymDQIqTfgVdmTSbHH8Px0u/nNFqxQwBab3Tza22ts1Z8fO3/Mq3ufISeI+VRRtWyuNWfrC+eV3gpRLrAw4piFL4+KCTlNaWuGqEDPExNQpU+AMt28P0/SeaucdgxzJpOPeISMRBWdYNBQh5DNaBYbmCItRlr13X/p+z+h4ukVwN/v/67Tc6r+/53yv1YA4cH+/7mP8u91u17V/w+B27yhr4qUfya3NOZUb+9M/l1nte4z74o+g6OZxrOyKhtMM287t+GXTyMrMvyKFMB5azGhd52rN3CFChUqfB/8AQr6tbUAGgAA"
writeBin(RCurl::base64Decode(file_content), zz)
close(zz)
file.rename(from = zzfil, to = paste0(zzfil,".tar.gz"))
我应该如何序列化文件?即我应该如何填写函数file_to_string
和string_to_file
?
file_to_string <- function(input_file){
# Return a serialized string of input_file
}
string_to_file <- function(input_string){
# Return content to write to a file
}
original_file <- "original.tar.gz"
zzfil <- tempfile("copy")
zz <- file(zzfil, "wb")
file_content <- file_to_string(original_file)
writeBin(string_to_file(file_content), zz)
close(zz)
file.rename(from = zzfil, to = paste0(zzfil,".tar.gz"))
解决方案
对我来说,在 x86_64-pc-linux-gnu 平台上使用 R 3.4.4,RCurl 版本 1.95-4.10,示例代码生成一个非空文件,可以在 using 中读回readBin
,所以我无法重现你的空文件问题。
但这不是这里的主要问题。
usingwriteBin
无法实现您想要做的事情:它的用例是以二进制格式将 R-Object(向量)存储在文件系统上,然后用readBin
;将其读回。不要读入二进制文件,然后对其进行操作并保存新版本或生成一个二进制文件,除了readBin
.
在我看来:R 可能不是做二进制补丁的正确工具。
推荐阅读
- ios - Swift UITableview 在文本框中编辑不同的值
- python - Stripe 订阅在 Django/Python 上创建重复付款
- elasticsearch - ElasticSearch 更新 API 脚本 - 创建结构数组
- javascript - 如何使用 Joi 最新版本验证枚举字符串?
- c++ - 如何将带有浮点数的字符串转换为十进制?
- python - 如何修复点子?pip 无法运行 main 函数
- c# - ASP.NET Core 3.0 中 UPN 的 Active Directory 身份验证
- python - Matplotlib 在 jupyter 和 python 中产生不同的结果
- javascript - React 状态上的映射函数 - 带有获取的 API 数据的状态
- swift - 在 iOS 13.x SDK viewWillDisappear/viewDidDisappear 在 popToRootViewController 操作期间不调用