Python 将包含\x01个字符的字符串保存到磁盘

Python 将包含\x01个字符的字符串保存到磁盘,python,string,python-3.x,pandas,Python,String,Python 3.x,Pandas,我需要将包含chr(1)字符的字符串写入磁盘以分隔字段。最后,我需要在Pandas中用read_csv()``打开这个文件(希望使用C解析器,尽管这现在有点相关) 我的数据以字节形式存储在内存中: > data? Type: bytes String form: b'foo\x01302.0\x011407339259000\nbar\x01206.0\x011407339259230\n < .. > 如何在Python 3中保存此字节流,以便稍后在Panda

我需要将包含
chr(1)
字符的字符串写入磁盘以分隔字段。最后,我需要在Pandas中用
read_csv
()``打开这个文件(希望使用C解析器,尽管这现在有点相关)

我的数据以字节形式存储在内存中:

> data?
Type:        bytes
String form: b'foo\x01302.0\x011407339259000\nbar\x01206.0\x011407339259230\n < .. >
如何在Python 3中保存此字节流,以便稍后在Pandas中打开它:

 read_csv('foo.csv',sep='\x01')
?

我试过:

  with open('foo.csv', 'w') as f:
    f.write(data.decode(encoding='ascii'))
没有运气。如果以后尝试使用以下命令打开文件:

pd.read_csv('my_file', sep='\x01')
我得到了一个有几行和一列的数据帧(即没有字段拆分)

更新 然后:

pd.read_csv('my_file', sep='\x01')

我还得到了一个有几行和一列的数据帧(即没有字段拆分)。

如果您有需要写入的二进制字符/字节,您还需要以二进制模式打开,即
打开('foo.csv','wb')
,然后只需写入数据(因为它已经是
字节类型的数据)

假设文件编写正确,您应该能够像这样读取它。无论如何,为了你的缘故,我现在安装了pandas,如果我尝试做你想做的事情,就会发生这种情况:

>>> with open('dummy.csv', 'wb') as f:
...     f.write(b'foo\x01302.0\x011407339259000\nbar\x01206.0\x011407339259230\n')
... 
48
>>> import pandas
>>> foo = pandas.read_csv('dummy.csv', sep='\x01')
>>> foo.keys()
Index(['foo', '302.0', '1407339259000'], dtype='object')
>>> foo.values
array([['bar', 206.0, 1407339259230]], dtype=object)

请注意,所有值都是您所期望的值。

对-您已经有了ByTestStream,这就是您的文件。不需要乱编代码,您知道要写入的确切字节数。metatoaster和@PeterDeGlopper。这对我没用。请参阅我文章中的更新内容。@user815423426用一个实际的例子更新了答案,以表明我之前所做的将为您提供预期的结果。您对编解码器软件包有何看法?所以像这样的例子:csvreader=csv.reader(codecs.open(“some.csv”、“r”、“cp1252”))“没有运气”是什么意思?发生什么事了?@abarnert我刚刚更新了帖子
pd.read_csv('my_file', sep='\x01')
# assuming isinstance(data, bytes) is True
with open('foo.csv', 'wb') as f:
    f.write(data)
>>> with open('dummy.csv', 'wb') as f:
...     f.write(b'foo\x01302.0\x011407339259000\nbar\x01206.0\x011407339259230\n')
... 
48
>>> import pandas
>>> foo = pandas.read_csv('dummy.csv', sep='\x01')
>>> foo.keys()
Index(['foo', '302.0', '1407339259000'], dtype='object')
>>> foo.values
array([['bar', 206.0, 1407339259230]], dtype=object)