【问题标题】:Cannot save byte literals to csv file with Python无法使用 Python 将字节文字保存到 csv 文件
【发布时间】:2021-07-28 10:43:06
【问题描述】:

我正在尝试编写一个程序来加密用户输入的文本数据并将加密的信息保存到 csv 文件中。要使用流密码,我首先将字符串类型数据转换为字节文字,然后尝试以这种格式保存它。问题出现在我下次打开程序时重新读取csv文件时,我保存为字节类型的数据已经转换为字符串类型,包括b''。请参考下面的代码。

IN:
from Crypto.Cipher import Salsa20
import pandas as pd

df = pd.DataFrame({'col1': ['secret info', 'more secret info'], 'col2': ['top secret stuff', 'hide from prying eyes']})

key = b'*Thirty-two byte (256 bits) key*'
nonce = b'*8 byte*'
cipher = Salsa20.new(key=key, nonce=nonce)

for col in df.columns:
    df[col] = df[col].apply(lambda a: a.encode('utf-8'))
    df[col] = df[col].apply(lambda a: cipher.encrypt(a))

print(f"Format of data in dataframe pre saving: {type(df.iloc[0, 0])}")
df.to_csv('my_data.csv', encoding='utf-8')

encrypted_df = pd.read_csv('my_data.csv', encoding='utf-8', index_col=0)
print(f"Format of data in re-read dataframe: {type(encrypted_df.iloc[0, 0])}")
OUT:
Format of data in dataframe pre saving: <class 'bytes'>
Format of data in re-read dataframe: <class 'str'>

有没有办法读取 csv 文件,使数据是字节类型而不是字符串,以便我可以轻松解密它?

我试过了:

  1. 在写入 csv 文件之前将数据解码回字符串,但这会导致 unicode 解码错误UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9c in position 0: invalid start byte

  2. 从字符串中剥离b'',然后编码为字节类型,但是编码器会添加负载反斜杠进行字符串转义,因此我无法解密文本。

我对编码比较陌生,对加密也很陌生,因此非常感谢简单的答案。

【问题讨论】:

    标签: python-3.x csv encryption


    【解决方案1】:

    如您所见,CSV 格式只能处理字符串。将字节转换为字符串的常用方法是 Base64。将您的字节更改为可以放入 CSV 文件的 Base64 字符串。

    当您读取 CSV 文件时,您将得到您的 Base64,然后您需要将 Base64 转换回原始字节。

    【讨论】:

    • 哇,这个效果很好。当你知道怎么做时,这很容易!我浪费了 6 个小时试图弄清楚这一点哈。非常感谢您的帮助
    • 感谢您的评论,但接受正确答案是有礼貌的。这有助于其他人稍后搜索相同的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多