【问题标题】:Python - appending/padding binary file adds garbagePython - 附加/填充二进制文件会添加垃圾
【发布时间】:2016-01-12 03:22:37
【问题描述】:

我正在尝试创建和连接二进制文件,我需要在它们之间添加填充,由于某种原因,python 添加了垃圾并显着增加了文件(并且它还更改了现有内容)。

我所做的是这样的

file1 = OPEN(read_file, "rb")
file2 = OPEN(read_file, "rb")
file3 = OPEN(write_file, "ab")
data = file1.read(f1_size)
file3.write(data)
file3.flush()
file1.close()
while padding_size > 0:
   file3.write(b'\x00')
   padding_size -= 1
   file3.flush() # Not sure this is mandatory here
data2 = file2.read(f2_size)
file3.write(data2)
file3.flush()
file2.close()
file3.close()

这甚至发生在我添加第二个二进制文件之前。如果我使用较小的尺寸(比如说 100),那么它写得很好,但是如果我使用稍大的尺寸,它就会变得很疯狂,并且会在输出文件中添加很多垃圾。 这段代码不是最优的,但对我来说并不重要,只要我能够正确添加填充。

感谢您的帮助。

更新
我实际上了解到另一个不应更改我的文件的脚本正在执行此操作,并由于失败而导致问题。 感谢您的见解和帮助,我对脚本进行了重大更改。

【问题讨论】:

  • 我没有答案,但我有一些笔记。首先,您永远不会读取第二个文件——在 while 循环期间大小会减为零,因此 file2.read(size) 不会读取任何内容。其次,你应该使用with open(file) 语法——docs.python.org/2/tutorial/inputoutput.html——这将有助于更好地跟踪你的代码,这将有助于调试这个问题。第三,您根本不需要flush,除非您需要查看整个脚本中的输出文件更改(而不仅仅是在结尾处)。
  • @DreadPirateShawn 我明白你的意思,我这里写了泛型变量,所以大小不正确,我会修复上面的。

标签: python file-io io padding


【解决方案1】:

问题可能与您正在做的额外工作(特别是指定输入大小)或您检查输出的方式(上面未指定)有关。

考虑以下内容,根据需要进行操作:

准备测试数据:

$ echo "abc" > input1
$ echo "def" > input2
$ zip input1.zip input1
  adding: input1 (stored 0%)
$ zip input2.zip input2
  adding: input2 (stored 0%)
$ cat -v input1.zip
PK^C^D
^@^@^@^@^@)}NGNM-^AM-^HG^D^@^@^@^D^@^@^@^F^@^\^@input1UT    ^@^CM-^^w^^V[x^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@abc
PK^A^B^^^C
^@^@^@^@^@)}NGNM-^AM-^HG^D^@^@^@^D^@^@^@^F^@^X^@^@^@^@^@^A^@^@^@M-$M-^A^@^@^@^@input1UT^E^@^CM-^^w^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@PK^E^F^@^@^@^@^A^@^A^@L^@^@^@D^@^@^@^@^@
$ cat -v input2.zip
PK^C^D
^@^@^@^@^@.}NGM-<M-^Sn^H^D^@^@^@^D^@^@^@^F^@^\^@input2UT    ^@^CM-'w^^V[x^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@def
PK^A^B^^^C
^@^@^@^@^@.}NGM-<M-^Sn^H^D^@^@^@^D^@^@^@^F^@^X^@^@^@^@^@^A^@^@^@M-$M-^A^@^@^@^@input2UT^E^@^CM-'w^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@PK^E^F^@^@^@^@^A^@^A^@L^@^@^@D^@^@^@^@^@

完善的脚本“test.py”:

read_file1 = "input1.zip"
read_file2 = "input2.zip"
write_file = "output"
padding_size = 50

with open(write_file, "ab") as file3:
    with open(read_file1, "rb") as file1:
        data = file1.read()
        file3.write(data)
    while padding_size > 0:
        file3.write(b'\x00')
        padding_size -= 1
    with open(read_file2, "rb") as file2:
        data = file2.read()
        file3.write(data)

输出:

$ python test.py
$ cat -v output
PK^C^D
^@^@^@^@^@)}NGNM-^AM-^HG^D^@^@^@^D^@^@^@^F^@^\^@input1UT    ^@^CM-^^w^^V[x^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@abc
PK^A^B^^^C
^@^@^@^@^@)}NGNM-^AM-^HG^D^@^@^@^D^@^@^@^F^@^X^@^@^@^@^@^A^@^@^@M-$M-^A^@^@^@^@input1UT^E^@^CM-^^w^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@PK^E^F^@^@^@^@^A^@^A^@L^@^@^@D^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@PK^C^D
^@^@^@^@^@.}NGM-<M-^Sn^H^D^@^@^@^D^@^@^@^F^@^\^@input2UT    ^@^CM-'w^^V[x^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@def
PK^A^B^^^C
^@^@^@^@^@.}NGM-<M-^Sn^H^D^@^@^@^D^@^@^@^F^@^X^@^@^@^@^@^A^@^@^@M-$M-^A^@^@^@^@input2UT^E^@^CM-'w^^Vux^K^@^A^DM-]^E^@^@^DM-]^E^@^@PK^E^F^@^@^@^@^A^@^A^@L^@^@^@D^@^@^@^@^@
$ ls -l
total 24
-rw-r--r-- 1 foo bar   4 Oct 14 15:41 input1
-rw-r--r-- 1 foo bar 166 Oct 14 15:45 input1.zip
-rw-r--r-- 1 foo bar   4 Oct 14 15:41 input2
-rw-r--r-- 1 foo bar 166 Oct 14 15:45 input2.zip
-rw-r--r-- 1 foo bar 382 Oct 14 15:58 output
-rw-r--r-- 1 foo bar 406 Oct 14 15:58 test.py

注意事项:

文档——在这种情况下是https://docs.python.org/2/tutorial/inputoutput.html——有很好的建议,而且通常先花一点额外的时间来理解它们是非常明智的。

  • 例如,搜索“读取”,您会看到file.read() 读取整个文件,大小参数是可选的。那是一个不那么可动的部分——除非你真的必须,否则不要指定尺寸,因为你可能会错误地指定它。

  • 在阅读文档时,您会看到推荐使用“开放式”语法——这有助于使代码更易于阅读,这通常有助于调试和维护。

  • 搜索“flush”,实际上你根本找不到它——没有必要。谷歌“Python 刷新文件”,你会发现更详细的确认和解释“刷新”的用例是什么。这是另一个需要移除的活动部分。

因此我修改了上面的代码。

最后,总是花时间制作简单/小型的测试数据,就像我在这里所做的那样。它足够小,您可以看到整个输入文件和整个生成的输出文件,并且可以直观地确认它们没有损坏。此外,使用ls -l 可以看到(输出文件的大小)=(输入1 的大小)+(输入2 的大小)+ 填充。

现在,我们将何去何从?

此答案提供了可实现您既定目标的确认代码。 (耶!)当然,您可能仍然有错误 - 但即使是这样,现在您有一个参考点,您可以使用它来进一步调查您自己的复制案例,看看它有什么不同。 (如果确实不同,请随时发布一个新问题,使用您自己的测试数据、完整的可运行脚本以及您用来确定输出已损坏的方法。)

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 2017-05-12
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多