我有一个virtualenv运行python 3.4.0点子版本是pip 1.5.4我做pip安装电子邮件并得到错误:ImportError:在进程结束时没有名为'cStringIO'的模块(失败)如何获取电子邮件用于python 3.4.0的包
我用google搜索并在SO上搜索这些缓冲模块之间的区别.但是,我仍然不太了解,我认为我读到的一些帖子已经过时了.
在Python 2.7.11中,我使用了下载了特定格式的二进制文件r = requests.get(url).然后我通过StringIO.StringIO(r.content),cStringIO.StringIO(r.content)并io.BytesIO(r.content)设计用于解析内容的功能.
所有这三种方法都可用.我的意思是,即使文件是二进制文件,它仍然可以使用StringIO.为什么?
另一件事是他们的效率.
In [1]: import StringIO, cStringIO, io
In [2]: from numpy import random
In [3]: x = random.random(1000000)
In [4]: %timeit y = cStringIO.StringIO(x)
1000000 loops, best of 3: 736 ns per loop
In [5]: %timeit y = StringIO.StringIO(x)
1000 loops, best of 3: 283 µs per loop
In [6]: %timeit y = io.BytesIO(x)
1000 loops, best of 3: 1.26 ms per loop
Run Code Online (Sandbox Code Playgroud)
如上图所示 …
我正在使用pandas来管理大量的8字节整数.这些整数作为空格分隔的元素包含在逗号分隔的CSV文件中,并且数组大小约为10000x10000.
Pandas能够快速读取前几列中逗号分隔的数据作为DataFrame,并且还可以轻松地将空格分隔的字符串存储在另一个DataFrame中.当我尝试将表从一列空格分隔的字符串转换为8位整数的DataFrame时,就会遇到麻烦.
我尝试过以下方法:
intdata = pd.DataFrame(strdata.columnname.str.split().tolist(), dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
但内存使用情况令人难以忍受 - 价值10MB的整数消耗2GB内存.我被告知这是语言的限制,在这种情况下我无能为力.
作为一种可能的解决方法,我被建议将字符串数据保存为CSV文件,然后将CSV文件重新加载为以空格分隔的整数的DataFrame.这很好用,但为了避免写入磁盘的速度减慢,我尝试写一个StringIO对象.
这是一个最小的非工作示例:
import numpy as np
import pandas as pd
from cStringIO import StringIO
a = np.random.randint(0,256,(10000,10000)).astype('uint8')
b = pd.DataFrame(a)
c = StringIO()
b.to_csv(c, delimiter=' ', header=False, index=False)
d = pd.io.parsers.read_csv(c, delimiter=' ', header=None, dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 443, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 228, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 533, …Run Code Online (Sandbox Code Playgroud) 在我的方式配置python中的字符串方法,以便我可以使用最快的方法.我有这个代码来测试文件中的字符串连接,StringIO,StringIO和普通字符串.
#!/usr/bin/env python
#title : pythonTiming.py
#description : Will be used to test timing function in python
#author : myusuf
#date : 19-11-2014
#version : 0
#usage :python pythonTiming.py
#notes :
#python_version :2.6.6
#==============================================================================
import time
import cStringIO
import StringIO
class Timer(object):
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, *args):
self.end = time.time()
self.interval = self.end - self.start
testbuf = """ Hello This is a General String that will be repreated
This string will be written to a …Run Code Online (Sandbox Code Playgroud) 我正在查看StringIO它所说的内容的来源:
cStringIO,但它不是可子类化的.StringIO 就像一个内存文件对象,为什么它比真正的文件对象慢?
我试图直接将文件写入S3而不创建本地文件然后上传.
我正在使用cStringIO在内存中生成一个文件,但是我无法找到在boto3中上传它的正确方法.
def writetos3(sourcedata, filename, folderpath):
s3 = boto3.resource('s3')
data = open(sourcedata, 'rb')
s3.Bucket('bucketname').put_object(Key= folderpath + "/" + filename, Body=data)
Run Code Online (Sandbox Code Playgroud)
上面是我之前使用的本地文件的标准boto3方法,没有本地文件它不起作用,我得到以下错误:coercing to Unicode: need string or buffer, cStringIO.StringO found
.
因为内存文件(我相信)已经被认为是开放的,我尝试将其更改为下面的代码,但它仍然无效,没有错误给出脚本只是挂在方法的最后一行.
def writetos3(sourcedata, filename, folderpath):
s3 = boto3.resource('s3')
s3.Bucket('bucketname').put_object(Key= folderpath + "/" + filename, Body=sourcedata)
Run Code Online (Sandbox Code Playgroud)
只是为了获得更多信息,我试图写的值看起来像这样
(cStringIO.StringO object at 0x045DC540)
有没有人知道我在做错了什么?
我写了一个小基准,我比较了ZOCache的不同字符串连接方法.
所以它看起来像tempfile.TemporaryFile比其他任何东西都要快:
$ python src/ZOCache/tmp_benchmark.py
3.00407409668e-05 TemporaryFile
0.385630846024 SpooledTemporaryFile
0.299962997437 BufferedRandom
0.0849719047546 io.StringIO
0.113346099854 concat
Run Code Online (Sandbox Code Playgroud)
我一直在使用的基准代码:
#!/usr/bin/python
from __future__ import print_function
import io
import timeit
import tempfile
class Error(Exception):
pass
def bench_temporaryfile():
with tempfile.TemporaryFile(bufsize=10*1024*1024) as out:
for i in range(0, 100):
out.write(b"Value = ")
out.write(bytes(i))
out.write(b" ")
# Get string.
out.seek(0)
contents = out.read()
out.close()
# Test first letter.
if contents[0:5] != b"Value":
raise Error
def bench_spooledtemporaryfile():
with tempfile.SpooledTemporaryFile(max_size=10*1024*1024) as out:
for i in range(0, 100):
out.write(b"Value = …Run Code Online (Sandbox Code Playgroud) 如何在a内用另一个替换字符串StringIO?-我听说它们的长度相同是可能的。
尝试:
from cStringIO import StringIO
c = 'can\nhaz\nfoo'
sio = StringIO(c)
for line in sio:
if line == 'haz\n':
# sio.write('bar\n')
line = 'bar\n'
break
sio.seek(0)
sio.readlines() # [ 'can\n', 'haz\n', 'bar' ]
Run Code Online (Sandbox Code Playgroud)
PS:目前正在使用C解决方案,但宁愿进行这项工作。
StringIO其代码中有以下注释:
Notes:
- Using a real file is often faster (but less convenient).
- There's also a much faster implementation in C, called cStringIO, but
it's not subclassable.
Run Code Online (Sandbox Code Playgroud)
“真实文件通常更快”这句话对我来说真的很奇怪:写入磁盘怎么能胜过写入内存呢?我尝试分析这些不同的案例,得到的结果与这些文档以及这个问题的答案相矛盾。这个另一个问题确实解释了为什么 cStringIO 在某些情况下速度较慢,尽管我在这里没有进行任何连接。该测试将给定量的数据写入文件,然后查找开头并将其读回。在“新”测试中,我每次都创建一个新对象,而在“相同”测试中,我会截断并为每次重复重用相同的对象,以排除开销来源。对于使用数据量较小但数据量较大的临时文件来说,这种开销很重要。
代码在这里。
Using 1000 passes with size 1.0KiB
New StringIO: 0.0026 0.0025 0.0034
Same StringIO: 0.0026 0.0023 0.0030
New cStringIO: 0.0009 0.0010 0.0008
Same cStringIO: 0.0009 0.0009 0.0009
New tempfile: 0.0679 0.0554 0.0542
Same tempfile: 0.0069 0.0064 0.0070
==============================================================
Using 1000 passes with …Run Code Online (Sandbox Code Playgroud) 我有python 3.6.我想从另一个名为'run.py'的python文件中执行名为'operation.py'的python文件.
在operation.py我做from cStringIO import StringIO.PyCharm向我显示警告,没有名为StringIO的模块.我知道,因为python3我必须从io导入StringIO模块.但是,当我使用此导入时,此模块的功能不再起作用.
虽然有一个警告from cStringIO import StringIO,代码仍然有效(我知道这个导入确实有效,因为我试图使它成为一个注释,它无法运行).问题是,当我尝试通过'run.py'文件运行此文件时,它无法运行并打印以下消息:ModuleNotFoundError: No module named 'cStringIO'.
我试图在PyCharm中使用这个未解决的参考问题,但它没有帮助.
为什么'operation.py'会运行警告,但'run.py'不会?我怎么解决这个问题?
operation.py:
from cStringIO import StringIO
str_io = StringIO()
g = Generator(str_io, False)
# There is a full code here...
Run Code Online (Sandbox Code Playgroud)
run.py:
import operation
def main():
operation
Run Code Online (Sandbox Code Playgroud)
该operation.py有一个警告,但运行良好,run.py有失败.
cstringio ×10
python ×8
stringio ×8
python-3.x ×2
amazon-s3 ×1
boto3 ×1
bytesio ×1
csv ×1
pandas ×1
performance ×1
python-2.7 ×1
python-3.6 ×1
string ×1