我想打开一个文件,解码数据格式(从base64到ASCII),重写或保存解码后的字符串,或者返回同一个文件,或者新文件。
我打开,读取,解码(并作为测试打印)解码的base64字符串为可读格式(我相信ASCII)
我的目标是现在将此输出保存到:“newfile.txt”文档或返回原始的“test.mcz”文件,为我的后续步骤做好准备......
我知道有很棒的在线base64解码器,它们对我正在做的事情做得很好 - 我经常使用它们,但我的目标是将自己的程序编写为学习练习而不是任何事情(当我的互联网播放时)我需要一个离线程序)
这是我到目前为止的地方(原始文件是.mcz格式,这是游戏保存)
# PYTHON 3
import base64
f = open('test.mcz', 'r')
f_read = f.read()
# print(f_read) # was just as a test
new_f_read = base64.b64decode(f_read)
print (new_f_read)
这打印了我需要的可读代码,但是我不想只是将这个输出从Python shell复制并粘贴到另一个编辑器中,我想将它保存到文件中。 ..为了方便。
要么回到相同的test.mcz(我将在以后再次重新编码到base64)或者到新文件 - 因此保留原来的原样。
当我想要保存/写入存储在new_f_read变量中的这个解码输出时出现问题...这只是一个令人头疼的问题,在我开始之前我可以想象它是如何编写的,当我开始时我被绊倒了由于某些原因不得不把它全部切换到Python3(不要问......)我已经尝试了很多来自在线示例的变化 - 我不知道从哪里开始解释到目前为止我尝试过的东西。我无法将原始文件打开为“r”和“w”,所以一旦打开并解码,我就无法重新打开原始文件为“w”,因为它只是擦除了内容(仍然是编码的) -我想我需要编写函数来处理: 1.打开,读取,保存字符串到变量 2.操纵字符串 - 解码 3.将新字符串写入新文件或现有文件
我知道这听起来很容易,但我被卡住了...所以我在这里。如果有人展示示例,请花时间解释发生了什么,对我来说似乎没有意义,我有不明白的代码。如果这似乎是一件简单的事情,请道歉,谢谢。谢谢。
答案 0 :(得分:1)
首先,您绝对可以打开文件进行读写,而不会截断内容。这就是r+
模式的用途(参见https://docs.python.org/3/library/functions.html#open)。如果你这样做,那么模型是(a)打开文件,(b)读取它,(c)回到开头用例如: f.seek(0)
,(d)写下来。
其次,你可以简单地打开文件,阅读它,然后关闭文件,然后重新打开它,写下来再关闭它,如下所示:
# open the file for reading, read the data, then close the file
with open('test.mcz', 'rb') as f:
f_read = f.read()
new_f_read = base64.b64decode(f_read)
# open the file for writing, write the data, then close the file
with open('test.mcz', 'wb') as f:
f.write(new_f_read)
这可能是最简单的解决方案。
答案 1 :(得分:0)
最简单的方法是首先打开一个读取文件句柄,关闭它然后打开一个写句柄。读/写句柄很复杂,因为它们必须有一个指针指向文件中的位置,并且它增加了您不需要使用的开销。如果你愿意,你可以这样做,但这里浪费时间。
建议使用with运算符打开文件,因为当您离开with块时文件将自动关闭。
Sub DownloadFileFromURL()
Dim myURL As String, sFilename As String
myURL = "https://drive.google.com/file/d/0B1f6pKXGikYrVVQydFQ0TXZqSXc"
sFilename = "C:\Dump\file.jpg"
Dim WinHttpReq As Object, oStream As Object
Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
WinHttpReq.Open "GET", myURL, False ', "username", "password"
WinHttpReq.send
myURL = WinHttpReq.responseBody
If WinHttpReq.Status = 200 Then
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write WinHttpReq.responseBody
oStream.SaveToFile sFilename, 2 ' 1 = no overwrite, 2 = overwrite
oStream.Close
End If
End Sub
这与
相同import base64
import base64
with open('test.mcz', 'r') as f:
encode = base64.b64decode(f.read())
with open('test.mcz', 'wb') as f:
f.write(encode)