1

您好,我在写入然后从文件中读取确切数据时遇到问题。

我正在做的是首先将其转换liststring然后将其写入文件

S = [63, 16, 13, 30, 22, 13, 99, 68, 75, 91, 73, 80, 90]

现在如果我这样做是为了将它转换成字符串,

UpdatedPlainText = ''.join(chr(s) for s in S)

print("This is the Data:", UpdatedPlainText)

由于in original的两个int值的存在,数据将被弄乱,这等于13List\r

输出:

cDK[IPZ the Data: ?►

我知道这只是这样显示,但原始数据仍然存在。

可以使用它来检索数据,这里数据在打印之前先转换为整数,

L = list(ord(s) for s in UpdatedPlainText)
print(L)

输出:

[63, 16, 13, 30, 22, 13, 99, 68, 75, 91, 73, 80, 90]

但不是直接将数据转换回integerfrom String,如果我先将UpdatedPlainTextin 的值写入文件,

PlainText = open('uText.txt', 'w')
PlainText.write(UpdatedPlainText)
PlainText.close()

然后read这个文件,

PlainText = open('uText.txt', 'r')
PlainText = PlainText.read() 

然后打印文件中的数据,

L = list(ord(s) for s in PlainText)
print(L)

输出会有所不同,

[63, 16, 10, 30, 22, 10, 99, 68, 75, 91, 73, 80, 90]

如您所见,该值13被替换为10,这是由于\rwhich 等于13

我该如何解决这个问题?我怎样才能防止13转换成\r

4

4 回答 4

1

在 python 文档中它说:

Windows 上的 Python 区分了文本文件和二进制文件;读取或写入数据时,文本文件中的行尾字符会自动稍作更改。

您正在尝试检索与文本不同的数据,因此可以选择使用二进制模式(请参阅上面的答案。文档继续:

这种对文件数据的幕后修改对于 ASCII 文本文件来说很好,但它会破坏像 JPEG 或 EXE 文件中的二进制数据。在读取和写入此类文件时要非常小心使用二进制模式。在 Unix 上,将“b”附加到模式并没有什么坏处,因此您可以独立于平台使用它来处理所有二进制文件。

就像您的情况一样,默认模式是更改数据。因此,如果由于某种原因您想默认使用读写选项,您可以尝试在将字符串写入文件之前对其进行编码。

PlainText.encode('base64','strict')

并在阅读后解码

PlainText.decode('base64','strict')

太多的工作,但只是另一种选择。

于 2013-10-20T18:03:19.343 回答
0

您的目标是否只是将这些数字存储在文件中并稍后再读回?或者您是否专门尝试学习/使用二进制文件?如果您的目标是保存数字,那么您不需要转换为字符串等。使用 json 或类似的东西......

import json
with open('uText.txt','w') as txtfile:
    json.dump(S,txtfile)

稍后阅读它们:

with open('uText.txt','r') as infile:
    newList = json.load(infile)
于 2013-10-20T17:49:47.173 回答
0

您正在以“文本”模式打开文件,而不是“二进制”模式。如此处所述:http: //docs.python.org/2/library/functions.html#open您应该使用'bw'模式来避免在某些平台上写入/读取时可能转换换行符。

PlainText = open('uText.txt', 'bw')
...
PlainText = open('uText.txt', 'br')
于 2013-10-20T17:36:41.327 回答
0

以二进制模式读取文件:

with open('uText.txt', 'rb') as f:
    L = [x for x in f.read()]
于 2013-10-20T17:36:42.857 回答